Skip to content

Commit e18ebd8

Browse files
committed
zz
1 parent fbf254f commit e18ebd8

File tree

5 files changed

+175
-3
lines changed

5 files changed

+175
-3
lines changed

docs/.vitepress/constants.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,6 @@ export const FRIENDLY_LINK = [
7171
]
7272

7373
export const NAV_BANNER = {
74-
title: '🎉 假如中文编程语言也有江湖… 🎉',
75-
link: 'https://wa-lang.org/smalltalk/st0088.html',
74+
title: '🎉 凹语言中文版重新起航! 🎉',
75+
link: 'https://wa-lang.org/smalltalk/st0089.html',
7676
}

docs/.vitepress/inlined-scripts/restorePreference.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
}
77
}
88

9-
window.__WA_BANNER_ID__ = 'st0088'
9+
window.__WA_BANNER_ID__ = 'st0089'
1010
restore(`wa-docs-banner-${window.__WA_BANNER_ID__}`, 'banner-dismissed')
1111
})()

docs/public/st0089-01.png

32.7 KB
Loading

docs/smalltalk/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ title: 碎碎念
88

99
#
1010

11+
- 2025-10-23: [凹语言中文版重新起航!](st0089.md)
1112
- 2025-10-20: [假如中文编程语言也有江湖……](st0088.md)
1213
- 2025-09-30: [GitCode平台支持凹语言语法高亮](st0087.md)
1314
- 2025-09-29: [中文编程语言的突破点在哪里?](st0086.md)

docs/smalltalk/st0089.md

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
# 凹语言中文版重新起航!
2+
3+
- 时间:2025-10-23
4+
- 撰稿:柴树杉
5+
- 转载请注明原文链接:[https://wa-lang.org/smalltalk/st0089.html](https://wa-lang.org/smalltalk/st0089.html)
6+
7+
---
8+
9+
凹语言在立项之初就把改善中文支持放在了首位,从最初的和Go语言不一样的中文名字导出、到2022年7月开源开始就内置了中文关键字,中间更经历过更加激进的中文语法设计,现在这版的中文语法设计是前进一步后退半步的结果。
10+
11+
## 1. 你好世界
12+
13+
废话少说,先看看“你好世界”的素颜照:
14+
15+
![](/stoo89-01.png)
16+
17+
作为母语的码农,看代码的函数应该就能猜到大概意思了。
18+
19+
## 2. 中文编程语言实现生命游戏
20+
21+
“你好世界”的程序太简单,我们可以用凹语言中文语法实现一个简单的生命游戏。生命游戏的全称是康威生命游戏(Game of Life),剑桥大学约翰·何顿·康威设计的计算机程序。具体规则大家可以去网上查,这里就不展开了。
22+
23+
先看看`主控.wa`主函数:
24+
25+
```wz
26+
注: 版权 @2025 life 作者。保留所有权利。
27+
28+
引入 "假死门/画布"
29+
30+
函数·主控:
31+
输出("你好,凹语言中文版!")
32+
33+
画布对象, _ := 画布·查询画布("canvas")
34+
画布上下文, _ = 画布对象·获取平面上下文()
35+
完毕
36+
```
37+
38+
核心逻辑是从网页中查询一个名字为“canvas”的画布,然后保存到`画布上下文`全局变量中。游戏的核心逻辑在`生命游戏.wz`文件实现。
39+
40+
```wz
41+
注: 版权 @2025 life 作者。保留所有权利。
42+
43+
引入 "image"
44+
引入 "image/color"
45+
引入 "js/canvas"
46+
引入 "数学/随机数"
47+
引入 "洪荒"
48+
49+
全局:
50+
宽度 :整型 = 0
51+
高度 :整型 = 0
52+
53+
暂停中 :布尔 = 假
54+
55+
细胞状态甲 :*image·Gray = 空
56+
细胞状态乙 :*image·Gray = 空
57+
细胞状态快照 :*image·RGBA = 空
58+
59+
画布上下文 :canvas·Context2D
60+
完毕
61+
```
62+
63+
最开始是定义一组全局变量和游戏的状态。然后是游戏初始化函数:
64+
65+
```wz
66+
函数·初始化(宽, 高, 随机火种: 整型):
67+
宽度 = 宽
68+
高度 = 高
69+
70+
细胞状态甲 = image·NewGray(宽, 高)
71+
细胞状态乙 = image·NewGray(宽, 高)
72+
细胞状态快照 = image·NewRGBA(宽, 高)
73+
74+
随机数·点火(长整型(随机火种))
75+
循环 i := 0; i < 宽度*高度; i++:
76+
如果 (随机数·整数() % 2) != 0:
77+
细胞状态甲·Pix[i] = color·Gray(1)
78+
否则:
79+
细胞状态甲·Pix[i] = color·Gray(0)
80+
完毕
81+
完毕
82+
完毕
83+
```
84+
85+
然后是游戏的进化迭代函数:
86+
87+
```wz
88+
函数·进化迭代:
89+
如果 细胞状态快照 == 空:
90+
返回
91+
完毕
92+
93+
如果 !暂停中:
94+
生命进化()
95+
完毕
96+
97+
循环 横 := 0; 横 < 宽度; 横++:
98+
循环 竖 := 0; 竖 < 高度; 竖++:
99+
如果 细胞状态甲·Pix[竖*宽度+横] != 0:
100+
细胞状态快照·SetRGBA(横, 竖, 0xFF0000FF)
101+
否则:
102+
细胞状态快照·SetRGBA(横, 竖, 0xFFFFFFFF)
103+
完毕
104+
完毕
105+
完毕
106+
107+
注: 绘制到 Canvas
108+
画布上下文·PutImageData(
109+
洪荒·原生(细胞状态快照·Pix), 0, 0, 0, 0,
110+
单精(宽度), 单精(高度),
111+
)
112+
完毕
113+
```
114+
115+
`生命进化`函数是进化过程中如何进行弱肉强食的处理:
116+
117+
```wz
118+
结构·方向:
119+
横: 整型
120+
竖: 整型
121+
完毕
122+
123+
全局·四面八方 = [...]方向{
124+
{-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {1, 0}, {-1, 1}, {0, 1}, {1, 1},
125+
}
126+
127+
函数·生命进化:
128+
循环 竖 := 0; 竖 < 高度; 竖++:
129+
循环 横 := 0; 横 < 宽度; 横++:
130+
邻居数量 := 0
131+
循环 位 := 0; 位 < 8; 位++:
132+
邻横 := (横 + 四面八方[位]·横 + 宽度) % 宽度
133+
邻竖 := (竖 + 四面八方[位]·竖 + 高度) % 高度
134+
如果 细胞状态甲·Pix[邻竖*宽度+邻横] != 0:
135+
邻居数量++
136+
完毕
137+
完毕
138+
139+
如果 细胞状态甲·Pix[竖*宽度+横] != 0:
140+
找辙 邻居数量:
141+
有辙 2, 3:
142+
细胞状态乙·Pix[竖*宽度+横] = color·Gray(1)
143+
没辙:
144+
细胞状态乙·Pix[竖*宽度+横] = color·Gray(0)
145+
完毕
146+
否则:
147+
找辙 邻居数量:
148+
有辙 3:
149+
细胞状态乙·Pix[竖*宽度+横] = color·Gray(1)
150+
没辙:
151+
细胞状态乙·Pix[竖*宽度+横] = color·Gray(0)
152+
完毕
153+
完毕
154+
完毕
155+
完毕
156+
157+
注: 交换 细胞状态甲 和 细胞状态乙
158+
细胞状态甲, 细胞状态乙 = 细胞状态乙, 细胞状态甲
159+
完毕
160+
```
161+
162+
根据四面八方的细胞生命数量判断死活。完整的代码在这里:[https://gitcode.com/wa-lang/wa/tree/master/waroot/examples/life-game-wz/src](https://gitcode.com/wa-lang/wa/tree/master/waroot/examples/life-game-wz/src)
163+
164+
在项目的根目录(有wa.mod文件的那个目录),执行`wa run`即可编译并执行,最后自动打开浏览器页面试玩游戏。
165+
166+
## 3. 结语
167+
168+
网上始终存在很多污化和诋毁中文编程语言的声音,其实生命本身或许也是没有意义的,但是作为说中文母语的码农总得找点事情做。我们知道生命游戏最终总会进入一个环中,但即使是环依然展示了很多有趣的动画过程,甚至据说可以通过生命游戏构造出一个图灵机来。
169+
170+
中文编程语言的探索,恰如在生命游戏的循环中寻找有意思的过程,因为过程才是生命的意义。
171+

0 commit comments

Comments
 (0)