<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>语言设计 on CloudLake</title><link>https://cloudlake.eu.org/tags/%E8%AF%AD%E8%A8%80%E8%AE%BE%E8%AE%A1/</link><description>Recent content in 语言设计 on CloudLake</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Sun, 11 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://cloudlake.eu.org/tags/%E8%AF%AD%E8%A8%80%E8%AE%BE%E8%AE%A1/index.xml" rel="self" type="application/rss+xml"/><item><title>17 个词画出一朵玫瑰</title><link>https://cloudlake.eu.org/p/loom/</link><pubDate>Sun, 11 Oct 2026 00:00:00 +0000</pubDate><guid>https://cloudlake.eu.org/p/loom/</guid><description>&lt;img src="https://cloudlake.eu.org/p/loom/cover.jpg" alt="Featured image of post 17 个词画出一朵玫瑰" /&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 每轮固定转 1/47 圈，半径按 1+0.45·sin(3θ) 起伏 —— 走满一圈正好闭合&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.021277 turn&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.021277 i * 3 * sin 0.45 * 1 + 55 * fwd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.0008 i * color&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;七行，画出一朵三瓣玫瑰。&lt;/p&gt;&#10;&lt;p&gt;这是一门语言的完整程序。语料只有 &lt;strong&gt;17 个词&lt;/strong&gt;，但它&lt;strong&gt;图灵完备&lt;/strong&gt;——&lt;code&gt;jz&lt;/code&gt; 加回跳足以表达任意控制流。&lt;/p&gt;&#10;&lt;p&gt;打开一个 html 文件就能用：左边写程序，按 &lt;code&gt;Ctrl+Enter&lt;/code&gt; 重跑，画布上出现图案。&lt;strong&gt;单文件、离线、零依赖。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="17-个词"&gt;&lt;a href="#17-%e4%b8%aa%e8%af%8d" class="header-anchor"&gt;&lt;/a&gt;17 个词&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;词&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;作用&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;数字&lt;/code&gt; / &lt;code&gt;p0&lt;/code&gt;…&lt;code&gt;p5&lt;/code&gt; / &lt;code&gt;i&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;压入常量、参数滑杆、当前轮数&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;+ - / mod neg&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;二元算术；&lt;code&gt;neg&lt;/code&gt; 取负&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;&amp;gt; &amp;lt; sign&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;比较（返回 0/1）；&lt;code&gt;sign&lt;/code&gt; 取符号&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;sin cos&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;输入是&lt;strong&gt;圈&lt;/strong&gt;不是弧度：&lt;code&gt;0.25&lt;/code&gt; → 90°&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;rand&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;伪随机 0…1，种子固定 ⇒ 可复现&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;fwd back&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;沿朝向前进/后退（画线）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;turn right&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;转向：&lt;code&gt;turn 0.25&lt;/code&gt; = 左转 90°&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;jump&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;画笔瞬移到 (x, y)，不画线&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;N st&lt;/code&gt; / &lt;code&gt;N ld&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;存入 / 取出 N 号寄存器（N = 0…7）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;pen&lt;/code&gt; &lt;code&gt;color&lt;/code&gt; &lt;code&gt;width&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;抬落笔、色相 0…1、笔宽&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;jmp N&lt;/code&gt; / &lt;code&gt;jz N&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跳到第 N 行；&lt;code&gt;jz&lt;/code&gt; 在栈顶为 0 时跳&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;pause&lt;/code&gt; / &lt;code&gt;halt&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;交还控制权（动画靠它）/ 停机&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;栈是唯一的数据通道，所以约定是&lt;strong&gt;后缀式&lt;/strong&gt;：写 &lt;code&gt;0.25 turn&lt;/code&gt;，不写 &lt;code&gt;turn 0.25&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;跳转用&lt;strong&gt;代码行号&lt;/strong&gt;。跳到注释行或空行时会自动顺延到后面第一条真指令。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;程序会被反复执行&lt;/strong&gt;——这就是动画的来源，&lt;code&gt;i&lt;/code&gt; 是已经跑过的轮数。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="设计上真正需要决定的三件事"&gt;&lt;a href="#%e8%ae%be%e8%ae%a1%e4%b8%8a%e7%9c%9f%e6%ad%a3%e9%9c%80%e8%a6%81%e5%86%b3%e5%ae%9a%e7%9a%84%e4%b8%89%e4%bb%b6%e4%ba%8b" class="header-anchor"&gt;&lt;/a&gt;设计上真正需要决定的三件事&#10;&lt;/h2&gt;&lt;p&gt;写这门语言的过程中，有三处不做决定就写不下去。&lt;/p&gt;&#10;&lt;h3 id="1-循环的进度谁提供"&gt;&lt;a href="#1-%e5%be%aa%e7%8e%af%e7%9a%84%e8%bf%9b%e5%ba%a6%e8%b0%81%e6%8f%90%e4%be%9b" class="header-anchor"&gt;&lt;/a&gt;1. 循环的进度谁提供？&#10;&lt;/h3&gt;&lt;p&gt;不是 &lt;code&gt;while&lt;/code&gt;，而是「程序反复执行 + &lt;code&gt;i&lt;/code&gt; 计数」。&lt;/p&gt;&#10;&lt;p&gt;好处是写参数方程时不用自己维护计数器。代价很实在：&lt;strong&gt;每轮的步长必须一样&lt;/strong&gt;。用 &lt;code&gt;i&lt;/code&gt; 递增角度画不出闭合曲线——每轮走的角不同，永远回不到起点。&lt;/p&gt;&#10;&lt;p&gt;这个坑是我自己写示例时踩到的，注释留在了「三瓣」示例里。&lt;/p&gt;&#10;&lt;h3 id="2-循环里的状态放哪"&gt;&lt;a href="#2-%e5%be%aa%e7%8e%af%e9%87%8c%e7%9a%84%e7%8a%b6%e6%80%81%e6%94%be%e5%93%aa" class="header-anchor"&gt;&lt;/a&gt;2. 循环里的状态放哪？&#10;&lt;/h3&gt;&lt;p&gt;最初只有栈。而栈每轮必须清空，否则运行时会一圈圈涨。&lt;/p&gt;&#10;&lt;p&gt;结果：&lt;strong&gt;累加器根本写不出来&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;所以加了&lt;strong&gt;寄存器&lt;/strong&gt;：&lt;code&gt;5 0 st&lt;/code&gt; 存、&lt;code&gt;0 ld&lt;/code&gt; 取。&lt;/p&gt;&#10;&lt;p&gt;栈保持&amp;quot;每轮归零&amp;quot;的干净语义，跨轮状态一律走寄存器。分析器因此能给出很强的保证：&lt;strong&gt;程序停止时栈必须是空的&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h3 id="3-怎么保证这些约定不被写坏"&gt;&lt;a href="#3-%e6%80%8e%e4%b9%88%e4%bf%9d%e8%af%81%e8%bf%99%e4%ba%9b%e7%ba%a6%e5%ae%9a%e4%b8%8d%e8%a2%ab%e5%86%99%e5%9d%8f" class="header-anchor"&gt;&lt;/a&gt;3. 怎么保证这些约定不被写坏？&#10;&lt;/h3&gt;&lt;p&gt;靠 &lt;code&gt;analyze()&lt;/code&gt;：对编译出的指令做前向数据流分析。&lt;/p&gt;&#10;&lt;p&gt;一条指令被不同路径以不同栈深到达，就重新入队（上限 6 个栈深，再多就是无限增长）。&lt;/p&gt;&#10;&lt;p&gt;判据是&lt;strong&gt;程序停止时栈深为 0&lt;/strong&gt;。这一条覆盖三种坑：栈被弹穿、分支不均衡、循环里偷偷堆值。&lt;/p&gt;&#10;&lt;p&gt;被拒绝时给的是可读的诊断：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✗ 栈不平衡：第 1 行（栈在循环里无限增长（同一条指令被越来越深的栈反复到达））。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 每个词都要自己把栈收干净，跳转的两个分支不能一个多一个少。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;编译期还有一道 peephole：&lt;code&gt;N fwd&lt;/code&gt; 折成一条带参指令（&lt;code&gt;fwd#N&lt;/code&gt;），既让指令数少一半，也消掉了&amp;quot;两个字面量在分支里叠在栈上&amp;quot;的歧义。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="验证"&gt;&lt;a href="#%e9%aa%8c%e8%af%81" class="header-anchor"&gt;&lt;/a&gt;验证&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="n"&gt;verify&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mjs&lt;/span&gt; &lt;span class="c1"&gt;# 63 项断言&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="n"&gt;verify&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mjs&lt;/span&gt; &lt;span class="c1"&gt;# 27 项断言（真机 Chromium）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;samples&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mjs&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="c1"&gt;# 逐个示例：编译 → 栈分析 → 真跑一遍&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;确定性&lt;/strong&gt;：同一种子逐位一致，不同种子不同图 ⇒ 任何观察都可复现&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;敌意输入&lt;/strong&gt;：空程序、只有注释、除零、取模零、寄存器槽越界、&lt;code&gt;1e9&lt;/code&gt; 大数 —— 都不崩&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;性能&lt;/strong&gt;：约 &lt;strong&gt;2400 万条指令/秒&lt;/strong&gt;（单线程）；界面默认每秒执行 600 条&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;示例是机械生成的&lt;/strong&gt;：生成器先编译、做栈分析、真跑 8000 步，全部通过才写回 &lt;code&gt;loom.html&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;最后这条是被逼出来的做法——&lt;strong&gt;在此之前我手工改示例错了五次&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h3 id="验证抓到的-8-个真实缺陷"&gt;&lt;a href="#%e9%aa%8c%e8%af%81%e6%8a%93%e5%88%b0%e7%9a%84-8-%e4%b8%aa%e7%9c%9f%e5%ae%9e%e7%bc%ba%e9%99%b7" class="header-anchor"&gt;&lt;/a&gt;验证抓到的 8 个真实缺陷&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;#&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;缺陷&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;症状&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跳转目标被折成 &lt;code&gt;[&amp;quot;lit&amp;quot;, idx]&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;jz&lt;/code&gt; 拿到 0 而不是目标行，条件跳转全部失效&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跳转占位指令多占一个槽位&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;目标整体错位，&lt;code&gt;i&lt;/code&gt; 永不递增&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跳转参数是&lt;strong&gt;字符串&lt;/strong&gt; &lt;code&gt;&amp;quot;0&amp;quot;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;Number.isFinite(&amp;quot;0&amp;quot;)&lt;/code&gt; 为 false ⇒ 回边从未被分析&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;末端判定读的是执行&lt;strong&gt;前&lt;/strong&gt;的栈深&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;1 fwd&lt;/code&gt; 这类正常程序被误判不平衡&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;分析器只记&amp;quot;首达&amp;quot;栈深&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;每轮偷偷堆值的程序被放行&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;缺&amp;quot;每轮入口栈深一致&amp;quot;不变量&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;同上——运行 1500 步后栈涨到 1500&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;7&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;示例里 &lt;code&gt;i 0.1 color&lt;/code&gt; 的栈残留&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;每轮留一个数，栈无限增长&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自动取景用&amp;quot;全部历史外接框&amp;quot;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;随机游走把视野撑到无穷，画面全黑&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;第 8 条不是语言问题，是&lt;strong&gt;可视化策略&lt;/strong&gt;问题。用历史包络去取景，对无界图形必然是错的；改成跟随画笔当前位置之后才正常。&lt;/p&gt;&#10;&lt;p&gt;第 3 条尤其典型：&lt;code&gt;&amp;quot;0&amp;quot;&lt;/code&gt; 和 &lt;code&gt;0&lt;/code&gt; 在 JavaScript 里看起来都像 0，但 &lt;code&gt;Number.isFinite(&amp;quot;0&amp;quot;)&lt;/code&gt; 是 &lt;code&gt;false&lt;/code&gt;。于是回边从来没被分析过，&lt;strong&gt;静态检查等于不存在&lt;/strong&gt;——而界面一切正常。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="它现在能画什么"&gt;&lt;a href="#%e5%ae%83%e7%8e%b0%e5%9c%a8%e8%83%bd%e7%94%bb%e4%bb%80%e4%b9%88" class="header-anchor"&gt;&lt;/a&gt;它现在能画什么&#10;&lt;/h2&gt;&lt;p&gt;它只画线。但 17 个词加上反复执行，能出来的东西比想象的多：蕨类、格栅、漂移的涡、以及那朵玫瑰。&lt;/p&gt;&#10;&lt;p&gt;参数滑杆 &lt;code&gt;p0&lt;/code&gt;…&lt;code&gt;p5&lt;/code&gt; 让你不改代码就能调形状——这也是它作为一个&amp;quot;玩的东西&amp;quot;成立的原因。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p style="text-align:center;margin:2.5em 0"&gt;&#13;&#10;&lt;a href="https://cloudlake.eu.org/lab/loom/" style="display:inline-block;padding:12px 26px;border-radius:8px;background:var(--accent-color);color:var(--accent-color-text);text-decoration:none;font-weight:600"&gt;打开 Loom 玩一下 →&lt;/a&gt;&#13;&#10;&lt;/p&gt;&#13;&#10;&lt;hr&gt;&#10;&lt;h2 id="还能往哪走"&gt;&lt;a href="#%e8%bf%98%e8%83%bd%e5%be%80%e5%93%aa%e8%b5%b0" class="header-anchor"&gt;&lt;/a&gt;还能往哪走&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;图形输出&lt;/strong&gt;：现在只画线。加 &lt;code&gt;fill&lt;/code&gt; / &lt;code&gt;stroke&lt;/code&gt; 路径模式就能做面&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;多画笔&lt;/strong&gt;：&lt;code&gt;pen&lt;/code&gt; 已经是状态机，加若干&amp;quot;画笔槽&amp;quot;就能一次画多层&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;编辑器&lt;/strong&gt;：行号已经在了，差行内报错高亮；&lt;code&gt;analyze()&lt;/code&gt; 已经能给出准确行号，接口是现成的&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;17 个词听起来很少。&lt;/p&gt;&#10;&lt;p&gt;但语言的表达能力从来不是词表决定的，是&lt;strong&gt;组合规则&lt;/strong&gt;决定的。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item></channel></rss>