但一到 AST → 字节码就翻车:问题原教旨 λ工程补丁变量捕获纯 nameless 语法De Bruijn index + up-value 表递归定义Y combinator 炸栈额外 letrec 线上事故:一次 “letrec” 导致 TCO 失效的血案上线第二周,脚本里写了:(letrec ((f (lambda (x) (if (zero? 排查发现: letrec 展开后多出一条 SET! 指令,不再处于尾位置,TCO 检测失败。 修复:把 letrec 的初始化语句提前到函数头,让递归调用回归最后一个表达式。
Expression "(" Expression ")" * | "let" Identifier "=" Expression "in" Expression * | "letrec def toString = "(let " + binding + " = " + definition + " in " + body + ")" } case class Letrec , definition: Expression, body: Expression) extends Expression { override def toString = "(letrec definitionType) analyze(body, newEnv, nongeneric) } case Letrec (Identifier("factorial"), // letrec factorial = Lambda(Identifier("n"), // lambda