Common Lisp中read-from-string读取"(+ 4 5 6)"返回9的原因是什么
为什么调用read-from-string会得到看似不符合预期的结果?
复现运行结果
CL-USER> (read-from-string "(+ 4 5 6)") (+ 4 5 6) 9 CL-USER> (+ 4 5 6) 15 CL-USER> (eval (read-from-string "(+ 4 5 6)")) 15
原因说明
这个结果完全符合Common Lisp的标准设计,不存在逻辑异常,核心规则如下:
read-from-string是Reader层的解析函数,只做语法解析,不触发求值
它的核心职责是把输入字符串里的文本,按照Lisp S表达式语法规则解析成对应的内存Lisp对象,不会对解析出的对象做任何运算。所以第一个返回值(+ 4 5 6)只是解析完成的列表,不会自动算出加法结果15。只有手动把这个解析结果传给eval函数,才会进入求值阶段得到运算值,这也是最后一行测试代码返回15的原因。- 第二个返回值
9是读取终止位置的索引,和算术计算无关
Common Lisp规范中,所有read系列函数(包括从流读取的read、从字符串读取的read-from-string)都会返回两个值:第一个是解析得到的Lisp对象,第二个是本次读取操作停止时,在输入源中的偏移位置。对于字符串输入,这个偏移是从0开始计数的字符索引。
逐个数传入字符串"(+ 4 5 6)"的字符索引:0位是左括号(、1位是+、2位是空格、3位是4、4位是空格、5位是5、6位是空格、7位是6、8位是右括号),总共9个有效字符。当reader解析完完整的列表S表达式后,读取指针正好停在字符串末尾之后的第9位,所以第二个返回值就是9,和加法运算的结果没有任何关联。
内容的提问来源于stack exchange,提问作者ruby_object
相关产品推荐
相关产品推荐

