SBCL使用--script执行Common Lisp代码的解析执行逻辑问询
SBCL脚本模式执行逻辑解答
现象说明
运行如下Common Lisp代码:
(print "A") (print "B") (print "C - No closing bracket"
执行命令:sbcl --script ./test.lisp
会先正常输出"A"、"B",之后才抛出缺少闭合括号的语法错误。
核心结论
SBCL在--script模式下以单个S表达式为单位逐段处理,解析完成立即执行,再处理下一段,不会先解析整个文件再统一执行。
具体逻辑
- Lisp的Reader(读取器)以括号包裹的完整S表达式为最小读取单位,每次从输入流中读取一个完整的S表达式,完成解析、编译后立刻执行,之后才会读取下一个S表达式。
- 测试代码中的前两个
(print)调用都是完整的S表达式,会依次被处理执行,所以"A"和"B"会正常打印。 - 读取到第三个不完整的
(print表达式时,Reader无法匹配到对应的闭合括号,才会触发语法报错,此时前两个表达式已经执行完毕。
如果SBCL采用先全量解析整个文件生成AST再执行的逻辑,会在执行任何代码前就检测到语法错误,根本不会有"A"、"B"的输出,和观测到的现象不符。
内容的提问来源于stack exchange,提问作者christian wuensche
相关产品推荐
相关产品推荐

