yfaming on Nostr: 看完了 Crafting Interpreters 第 9 章,Control Flow。 ...
看完了 Crafting Interpreters 第 9 章,Control Flow。
这一章增加了逻辑表达式(and、or),if 语句,while 和 for 循环。
实现 for 循环时,介绍了一下语法糖 syntactic sugar,在 parse 时,就把 for 循环给改写为 while 循环语句了。这就是脱糖 desugaring 过程。
Lox 的循环不支持 continue 和 break 语句。所以大大降低了实现难度。
而因为同样原因,我感觉语法分析阶段做的事情非常少。基本上 parse 得到语法树(Stmt class)之后,就结束了,没有额外工作,感觉有所缺憾。希望后续章节能够涉及这方面。
刷完 Crafting Interpreters 第 8 章,Statements and State。
这一章内容较多。增加了对语句的支持,包括表达式语句、print 语句、变量声明语句。同时增加了赋值表达式,并且支持了作用域。
实现作用域时使用的 Environment,与 Peter Novig 的 [(How to Write a (Lisp) Interpreter (in Python))](https://www.norvig.com/lispy.html) 经典文章里的,是同一思路。
最后讨论了一下变量声明是显式好,还是隐式好。结论是,显式更好。
Lox 相比真正编程语言,还缺少控制结构(if、while 等)、函数。这是接下来两章的内容。
现在的代码量只有 1059 行(不含注释和空行),已经做到这个程度,太神奇了。
随着内容的增加,感觉定义好 grammar 规则非常重要。事先要做好推演。
不然的话,越往后越容易出现问题。
nevent1q…wn2z
Published at
2026-08-02 04:45:51 UTCEvent JSON
{
"id": "871a64eb56acc8de0bd69bbc8323b8188b0fa18e53d1f73c6adc77cf8e2a35c3",
"pubkey": "908fbc3babc322eea473a0ab1e6bf6b3adcf899288ac97b2fa79f34ad408d4e4",
"created_at": 1785645951,
"kind": 1,
"tags": [
[
"q",
"4e292316f621d9240c8ce63c9f4550731f792927e936799426bb4bb3b4cbb947",
"wss://relay.damus.io/",
"908fbc3babc322eea473a0ab1e6bf6b3adcf899288ac97b2fa79f34ad408d4e4"
]
],
"content": "看完了 Crafting Interpreters 第 9 章,Control Flow。\n\n这一章增加了逻辑表达式(and、or),if 语句,while 和 for 循环。\n\n实现 for 循环时,介绍了一下语法糖 syntactic sugar,在 parse 时,就把 for 循环给改写为 while 循环语句了。这就是脱糖 desugaring 过程。\n\nLox 的循环不支持 continue 和 break 语句。所以大大降低了实现难度。\n\n而因为同样原因,我感觉语法分析阶段做的事情非常少。基本上 parse 得到语法树(Stmt class)之后,就结束了,没有额外工作,感觉有所缺憾。希望后续章节能够涉及这方面。\n\nnostr:nevent1qvzqqqqqqypzpyy0hsa6hseza6j88g9tre4ldvade7ye9z9vj7e0570nft2q348yqy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qpqfc5jx9hky8vjgryvuc7f732swv0hj2f8aym8n9pxhd9m8dxth9rsde5d8d",
"sig": "a6ab30fcce1867ea27c734f33ef26aabfa4f5ce2941058b190a21a70b79554e8bd27eb50f3415e918e530c2b6fa4d2854cd9eecefdfce1fa5bb4e736bae5f8c7"
}