为什么在 `dolist` 表达式中插入 `format` 函数在 Common Lisp 中不起作用?
Why inserting `format` function inside a `dolist` expression does not work in Common Lisp?
我正在使用 SBCL、Eamcs 和 Slime。使用 print
函数,我可以:
CL-USER> (dolist (item '(1 2 3))
(print item))
1
2
3
NIL
此外,format
函数适用于单个元素:
CL-USER> (format nil "~a" 1)
"1"
为什么在 dolist
中插入 format
函数不起作用?
CL-USER> (dolist (item '(1 2 3))
(format nil "~a" item))
NIL
我期待看到 format
函数处理的列表的所有元素。
谢谢
有必要对格式函数做一个小调整以获得相同的结果:
CL-USER> (dolist (item '(1 2 3))
(format t "~a ~%" item))
1
2
3
NIL
答案是format
的第一个参数表示格式化输出的目的地。它可能是以下四种情况之一:
- 输出流;
t
表示*standard-output*
流的值;
nil
导致 format
到 return 格式化输出而不是打印它;
- 或带有填充指针的字符串,它将输出附加到填充指针处的字符串。
所以 (format nil ...)
不打印任何东西:它 returns something.
此处 DOLIST 打印数字列表和 returns NIL(因为默认情况下 DOLIST returns NIL)。
(dolist (item '(1 2 3))
(print item))
format nil …
创建一个字符串。但是 DOLIST returns NIL,所以你什么也看不到。
您可以 format t …
到标准输出,您可以 return 使用 DOLIST 和 return
的值,但是它 return 并退出循环(所以它不会' t 处理每个元素)。
您可以将 LOOP 与 collect
一起使用到 return 一些东西:
(loop for item in '(1 2 3)
collect (format nil "~a" item))
("1" "2" "3")
使用 do
不会打印也不会 return 任何东西。
我正在使用 SBCL、Eamcs 和 Slime。使用 print
函数,我可以:
CL-USER> (dolist (item '(1 2 3))
(print item))
1
2
3
NIL
此外,format
函数适用于单个元素:
CL-USER> (format nil "~a" 1)
"1"
为什么在 dolist
中插入 format
函数不起作用?
CL-USER> (dolist (item '(1 2 3))
(format nil "~a" item))
NIL
我期待看到 format
函数处理的列表的所有元素。
谢谢
有必要对格式函数做一个小调整以获得相同的结果:
CL-USER> (dolist (item '(1 2 3))
(format t "~a ~%" item))
1
2
3
NIL
答案是format
的第一个参数表示格式化输出的目的地。它可能是以下四种情况之一:
- 输出流;
t
表示*standard-output*
流的值;nil
导致format
到 return 格式化输出而不是打印它;- 或带有填充指针的字符串,它将输出附加到填充指针处的字符串。
所以 (format nil ...)
不打印任何东西:它 returns something.
此处 DOLIST 打印数字列表和 returns NIL(因为默认情况下 DOLIST returns NIL)。
(dolist (item '(1 2 3))
(print item))
format nil …
创建一个字符串。但是 DOLIST returns NIL,所以你什么也看不到。
您可以 format t …
到标准输出,您可以 return 使用 DOLIST 和 return
的值,但是它 return 并退出循环(所以它不会' t 处理每个元素)。
您可以将 LOOP 与 collect
一起使用到 return 一些东西:
(loop for item in '(1 2 3)
collect (format nil "~a" item))
("1" "2" "3")
使用 do
不会打印也不会 return 任何东西。