Common Lisp中read-from-string为何产生两个REPL输出?
Common Lisp中
read-from-string额外输出的原因与解决方法 问题原因与机制
你看到的额外数字(2和4)是read-from-string函数的第二个返回值,代表读取完目标对象后,输入字符串中未被处理的第一个字符的位置索引:
- 第一个例子里,
(write-to-string var-string)生成字符串"50",read-from-string读取完数字50后,索引停在位置2(字符串索引从0开始,"5"对应0,"0"对应1,下一个未处理位置就是2),因此返回第二个值2。 - 第二个例子里,
1250转成字符串是"1250",共4个字符,读取完成后索引位置为4,所以返回第二个值4。
Common Lisp支持多值返回特性,标准库中不少函数会通过返回多个值提供额外上下文信息,read-from-string就是典型例子。而SBCL的REPL默认会打印表达式返回的所有值,这就是额外数字出现的原因。
抑制额外输出的方法
根据需求,你可以用以下方式处理:
- 只保留第一个返回值
使用values显式指定仅返回第一个值,REPL只会打印该值:
(values (read-from-string (write-to-string var-string)))
或用nth-value直接提取第一个返回值(索引从0开始):
(nth-value 0 (read-from-string (write-to-string var-string)))
- 完全抑制返回值打印
如果不需要该表达式的任何返回值被打印,将其包裹在progn中,最后返回nil或空值:
(progn (read-from-string (write-to-string var-string)) nil)
或返回无值,让REPL无内容可打印:
(progn (read-from-string (write-to-string var-string)) (values))
内容的提问来源于stack exchange,提问作者Ashley Ben Story
相关产品推荐
相关产品推荐

