yfaming on Nostr: # (How to Write a (Lisp) Interpreter (in Python)) ...
# (How to Write a (Lisp) Interpreter (in Python))
https://www.norvig.com/lispy.html跟着过了一遍,代码也敲了。感觉很过瘾。
精心选择了 Scheme 语法的一个子集,使得 parse 非常简单。
支持的语法其实只有一个:`exp := (op exp...)`。
```
Exp = Symbol | Number | List
List = (Exp ...)
```
它充分利用了 Python 的类型来表示 Symbol (str),Number (int|float),List (list)。
parse 时,去掉括号,但以 List 形式保留了树形结构。以此为 ast。
在 ast 基础上进行 eval。本质上是 ast walking interpret。
基于 dict 构建了求值环境 Env。并且将 Env 串起来,形成嵌套作用域,从而方便地支持了闭包。
Published at
2026-07-11 08:29:00 UTCEvent JSON
{
"id": "6ee0b39229c748ffba5babb2c3eaeae6de078ce6f1e248852ca7d9d2fa3facc4",
"pubkey": "908fbc3babc322eea473a0ab1e6bf6b3adcf899288ac97b2fa79f34ad408d4e4",
"created_at": 1783758540,
"kind": 1,
"tags": [],
"content": "# (How to Write a (Lisp) Interpreter (in Python))\n\nhttps://www.norvig.com/lispy.html\n\n跟着过了一遍,代码也敲了。感觉很过瘾。\n\n精心选择了 Scheme 语法的一个子集,使得 parse 非常简单。\n支持的语法其实只有一个:`exp := (op exp...)`。\n```\nExp = Symbol | Number | List\nList = (Exp ...)\n```\n\n它充分利用了 Python 的类型来表示 Symbol (str),Number (int|float),List (list)。\nparse 时,去掉括号,但以 List 形式保留了树形结构。以此为 ast。\n\n在 ast 基础上进行 eval。本质上是 ast walking interpret。\n基于 dict 构建了求值环境 Env。并且将 Env 串起来,形成嵌套作用域,从而方便地支持了闭包。",
"sig": "926976b8d4f4c67fa4d49692ecd7b4307e5b1f980dd3b31fda47e7f0442cea550218d2aa22f4f6ab339d6f21fc867dfe06bc0af37f6186307f6bb920f34623aa"
}