为什么在“dolist”表达式中插入“format”函数在 Common Lisp 中不起作用?
我正在使用SBCL,EAMC和粘液。使用 print
函数,我可以做:
CL-USER> (dolist (item '(1 2 3))
(print item))
1
2
3
NIL
此外,格式
函数适用于单个元素:
CL-USER> (format nil "~a" 1)
"1"
为什么以下插入格式
函数 > dolist
不起作用?
CL-USER> (dolist (item '(1 2 3))
(format nil "~a" item))
NIL
我期望看到格式
函数处理列表的所有元素。
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
答案是,
格式的第一个参数
表示格式化输出的目标。这可能是四件事之一:t
表示*标准输出*
流的值;nil
导致格式
返回格式的输出而不是打印;因此,
(格式nil ...)
没有打印任何东西:返回的东西。The answer to this is that the first argument to
format
denotes a destination for the formatted output. It may be one of four things:t
which denotes the value of the*standard-output*
stream;nil
which causesformat
to return the formatted output rather than print it;So
(format nil ...)
does not print anything: it returns something.在这里,dolist打印了一个数字列表并返回零(因为默认情况下dolist返回零)。
格式nil…
创建一个字符串。但是Dolist返回了NIL,所以您什么也看不到。您可以
格式t…
到标准输出,可以使用返回
的dolist返回值,但是它返回并退出循环(因此不会处理每个元素)。您可以将循环与
收集
一起返回某物:使用
do
也不会打印或返回任何东西。Here DOLIST prints a list of numbers and returns NIL (because by default DOLIST returns NIL).
format nil …
creates a string. But DOLIST returns NIL, so you see nothing.You can
format t …
to standard output, you can return values with DOLIST withreturn
, but it returns and exits the loop (so it won't process every element).You can use LOOP with
collect
to return something:using
do
wouldn't print nor return anything either.有必要对格式函数进行小调整以具有相同的结果:
It is necessary to do a minor tweak on the format function to have the same result: