|
| 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 | + |
| 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