Skip to content
On this page

凹语言中文版重新起航!


凹语言在立项之初就把改善中文支持放在了首位,从最初的和Go语言不一样的中文名字导出规则、到2022年7月开源开始就内置了中文关键字,中间更经历过更加激进的中文语法设计,现在这版的中文语法设计是前进一步后退半步的结果。

1. 你好世界

废话少说,先看看“你好世界”的素颜照:

作为母语的码农,看代码的函数应该就能猜到大概意思了,代码已经自解释。

2. 中文编程语言实现生命游戏

“你好世界”的程序太简单,我们可以用凹语言中文语法实现一个简单的生命游戏。生命游戏的全称是康威生命游戏(Game of Life),剑桥大学约翰·何顿·康威设计的计算机程序。具体规则大家可以去网上查,这里就不展开了。

先看看主控.wz主函数:

注: 版权 @2025 life 作者。保留所有权利。

引入 "假死门/画布"

函数·主控:
	输出("你好,凹语言中文版!")

	画布对象, _ := 画布·查询画布("canvas")
	画布上下文, _ = 画布对象·获取平面上下文()
完毕

核心逻辑是从网页中查询一个名字为“canvas”的画布,然后保存到画布上下文全局变量中。游戏的核心逻辑在生命游戏.wz文件实现。

注: 版权 @2025 life 作者。保留所有权利。

引入 "image"
引入 "image/color"
引入 "js/canvas"
引入 "数学/随机数"
引入 "洪荒"

全局:
	宽度 :整型 = 0
	高度 :整型 = 0

	暂停中 :布尔 = 假

	细胞状态甲  :*image·Gray = 空
	细胞状态乙  :*image·Gray = 空
	细胞状态快照 :*image·RGBA = 空

	画布上下文 :canvas·Context2D
完毕

最开始是定义一组全局变量和游戏的状态。然后是游戏初始化函数:

函数·初始化(宽, 高, 随机火种: 整型):
	宽度 = 宽
	高度 = 高

	细胞状态甲 = image·NewGray(宽, 高)
	细胞状态乙 = image·NewGray(宽, 高)
	细胞状态快照 = image·NewRGBA(宽, 高)

	随机数·点火(长整型(随机火种))
	循环 i := 0; i < 宽度*高度; i++:
		如果 (随机数·整数() % 2) != 0:
			细胞状态甲·Pix[i] = color·Gray(1)
		否则:
			细胞状态甲·Pix[i] = color·Gray(0)
		完毕
	完毕
完毕

然后是游戏的进化迭代函数:

函数·进化迭代:
	如果 细胞状态快照 == 空:
		返回
	完毕

	如果 !暂停中:
		生命进化()
	完毕

	循环 横 := 0; 横 < 宽度; 横++:
		循环 竖 := 0; 竖 < 高度; 竖++:
			如果 细胞状态甲·Pix[竖*宽度+横] != 0:
				细胞状态快照·SetRGBA(横, 竖, 0xFF0000FF)
			否则:
				细胞状态快照·SetRGBA(横, 竖, 0xFFFFFFFF)
			完毕
		完毕
	完毕

	注: 绘制到 Canvas
	画布上下文·PutImageData(
		洪荒·原生(细胞状态快照·Pix), 0, 0, 0, 0,
		单精(宽度), 单精(高度),
	)
完毕

生命进化函数是进化过程中如何进行弱肉强食的处理:

结构·方向:
	横: 整型
	竖: 整型
完毕

全局·四面八方 = [...]方向{
	{-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {1, 0}, {-1, 1}, {0, 1}, {1, 1},
}

函数·生命进化:
	循环 竖 := 0; 竖 < 高度; 竖++:
		循环 横 := 0; 横 < 宽度; 横++:
			邻居数量 := 0
			循环 位 := 0; 位 < 8; 位++:
				邻横 := (横 + 四面八方[位]·横 + 宽度) % 宽度
				邻竖 := (竖 + 四面八方[位]·竖 + 高度) % 高度
				如果 细胞状态甲·Pix[邻竖*宽度+邻横] != 0:
					邻居数量++
				完毕
			完毕

			如果 细胞状态甲·Pix[竖*宽度+横] != 0:
				找辙 邻居数量:
				有辙 2, 3:
					细胞状态乙·Pix[竖*宽度+横] = color·Gray(1)
				没辙:
					细胞状态乙·Pix[竖*宽度+横] = color·Gray(0)
				完毕
			否则:
				找辙 邻居数量:
				有辙 3:
					细胞状态乙·Pix[竖*宽度+横] = color·Gray(1)
				没辙:
					细胞状态乙·Pix[竖*宽度+横] = color·Gray(0)
				完毕
			完毕
		完毕
	完毕

	注: 交换 细胞状态甲 和 细胞状态乙
	细胞状态甲, 细胞状态乙 = 细胞状态乙, 细胞状态甲
完毕

根据四面八方的细胞生命数量判断死活。完整的代码在这里:https://gitcode.com/wa-lang/wa/tree/master/waroot/examples/life-game-wz/src

在项目的根目录(有wa.mod文件的那个目录),执行wa run即可编译并执行,最后自动打开浏览器页面试玩游戏。效果如下:

3. 结语

网上始终存在很多污化和诋毁中文编程语言的声音,其实生命本身或许也是没有意义的,但是作为说中文母语的码农总得找点事情做。我们知道生命游戏最终总会进入一个环中,但即使是环依然展示了很多有趣的动画过程,甚至据说可以通过生命游戏构造出一个图灵机来。

中文编程语言的探索,恰如在生命游戏的循环中寻找有意思的过程,因为过程才是生命的意义。通过凹语言中文版实现生命游戏,让我们重新开启变幻莫测的生命进化!