Conway's Game Of Life in APL
Dyalog在 YouTube 播放 ↗
字幕解读
演示用 Dyalog APL 逐步构造 Conway《生命游戏》:把邻域旋转编码为数组变换,通过外积生成邻居计数,再用布尔数组规则求出下一代。整个表达式无需显式循环或临时变量,也不依赖棋盘的固定尺寸;随后将表达式抽象成函数,迭代生成世代,并利用界面更新做动画。演讲还指出边界条件可通过运算符组合改变,从而在环面、无限平面等空间上运行。
自动字幕 · 引文按字幕原文展示,可点时间戳回看片段。
内容要点
- APL 的数组运算和高阶操作可把邻域计算与规则应用表达为单个数组表达式。
- 把表达式抽象成参数化函数后,可迭代生成后续世代,并复用在任意棋盘尺寸上。
- 把生命规则作为操作数传给不同运算符,可以改变空间边界/拓扑,而保留核心规则。
视频章节 6
- 将棋盘表示为数组
- 旋转邻域并计算邻居数
- 应用生命游戏规则
- 抽象成可复用函数
- 扩展棋盘并制作动画
- 改变边界与空间拓扑
具体观点与证据 3
将矩阵沿两个维度旋转并求和,可一次算出所有细胞的邻居计数。
计数包含细胞本身,需与生命游戏通常的八邻居定义区分。
if we sum the vector we see a neighbor count for each cellAPL 的下一代计算可写成无显式循环、无临时变量的单个数组表达式。
并不意味着底层没有迭代或计算成本。
you'll notice that it contains no explicit loops and no temporary variables旋转实现隐含了边缘回绕,因此模拟的是环面上的生命游戏,而非自动获得无限平面。
Taurus 为字幕对 torus 的转写;其他流形需另写算子。
the way we've coded it with rotations we've produced life on a Taurus补充字幕原文 2
演示者强调核心数组表达式不需要显式循环或中间变量,且尺寸不写死。
no explicit loops and no temporary variables生命规则函数可作为运算符的操作数,使同一规则能够适配不同空间边界。
operators that take our life function as an operand解读边界
这是简短的现场演示,着重展示 APL 表达能力;未比较实现性能或讨论更大规模计算。
相关视频与证据 1
设计权衡数组表达力强,不等于语言扩展无缝
生命游戏展示 APL 原语组合如何省去显式循环;Steele 则指出历史 APL 的用户定义与内建原语外观不一致,使社区难以无缝扩展语言。前者的表达能力并不自动解决后者的扩展接口问题。
Conway's Game Of Life in APL
数组原语能紧凑表达整代更新。
you'll notice that it contains no explicit loops and no temporary variablesGrowing a Language, by Guy Steele ↗
用户扩展是否像原语一样使用会影响语言增长。
new words defined by the user do not look like language primitives at all.▶ 20:13–20:18 · 观看片段适用边界 Steele 评价的是其演讲时期的 APL;不能据此断言现代 Dyalog 缺少用户函数或算子。