为什么在 `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 导致 formatreturn 格式化输出而不是打印它;
  • 或带有填充指针的字符串,它将输出附加到填充指针处的字符串。

所以 (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 任何东西。