为什么在“dolist”表达式中插入“format”函数在 Common Lisp 中不起作用?

发布于 2025-01-19 22:03:06 字数 604 浏览 0 评论 0 原文

我正在使用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

我期望看到格式函数处理列表的所有元素。

谢谢

I am using SBCL, Eamcs, and Slime. Using the print function, I can do:

CL-USER> (dolist (item '(1 2 3))
           (print item))
1 
2 
3 
NIL

In addition, format function works for single elements:

CL-USER> (format nil "~a" 1)
"1"

Why the following insertion of format function inside dolist does not work?

CL-USER> (dolist (item '(1 2 3))
           (format nil "~a" item))
NIL

I was expecting to see all elements of the list processed by the format function.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

开始看清了 2025-01-26 22:03:06

答案是,格式的第一个参数表示格式化输出的目标。这可能是四件事之一:

  • 输出进入的流;
  • 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:

  • a stream, to which output goes;
  • t which denotes the value of the *standard-output* stream;
  • nil which causes format to return the formatted output rather than print it;
  • or a string with a fill pointer, which will append the output to the string at the fill pointer.

So (format nil ...) does not print anything: it returns something.

南七夏 2025-01-26 22:03:06

在这里,dolist打印了一个数字列表并返回零(因为默认情况下dolist返回零)。

(dolist (item '(1 2 3))
    (print item))

格式nil…创建一个字符串。但是Dolist返回了NIL,所以您什么也看不到。

您可以格式t…到标准输出,可以使用返回的dolist返回值,但是它返回并退出循环(因此不会处理每个元素)。

您可以将循环与收集一起返回某物:

(loop for item in '(1 2 3)
    collect (format nil "~a" item))
("1" "2" "3")

使用 do 也不会打印或返回任何东西。

Here DOLIST prints a list of numbers and returns NIL (because by default DOLIST returns NIL).

(dolist (item '(1 2 3))
    (print item))

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 with return, but it returns and exits the loop (so it won't process every element).

You can use LOOP with collect to return something:

(loop for item in '(1 2 3)
    collect (format nil "~a" item))
("1" "2" "3")

using do wouldn't print nor return anything either.

划一舟意中人 2025-01-26 22:03:06

有必要对格式函数进行小调整以具有相同的结果:

CL-USER> (dolist (item '(1 2 3))
           (format t "~a ~%" item))
1 
2 
3 
NIL

It is necessary to do a minor tweak on the format function to have the same result:

CL-USER> (dolist (item '(1 2 3))
           (format t "~a ~%" item))
1 
2 
3 
NIL
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文