在scheme中使用map,当我使用显示功能时,会发生一件奇怪的事情

在scheme中使用map,当我使用显示功能时,会发生一件奇怪的事情,map,scheme,void,r5rs,Map,Scheme,Void,R5rs,在scheme中(我使用racket R5RS)调用此过程时 (map display '(1 2 3 4 5)) 它回来了 12345(#<void> #<void> #<void> #<void> #<void>) 12345(######) 为什么呢?void是怎么回事?收集列表中每个元素上每次调用函数的结果,并返回这些结果的列表 返回未指定的值#只是Racket正在使用的东西。它本可以返回42个 你可能有打字错误。它本该回

在scheme中(我使用racket R5RS)调用此过程时

(map display '(1 2 3 4 5))
它回来了

12345(#<void> #<void> #<void> #<void> #<void>)
12345(######)
为什么呢?void是怎么回事?

收集列表中每个元素上每次调用函数的结果,并返回这些结果的列表

返回未指定的值<代码>#只是Racket正在使用的东西。它本可以返回42个

你可能有打字错误。它本该回来的

12345(#<void> #<void> #<void> #<void> #<void>)
12345(######)

没有前面的开括号。即显示五个值,然后显示返回值。

在您的情况下,您需要为每个使用
,而不是
映射
<与地图不同,每个
的代码>是非收集的

此外,每个的
保证从左到右将列表项传递给函数<代码>映射
不提供此类保证,并且允许以任何顺序传递列表项。(虽然在Racket的特定情况下,
map确实使用从左到右的顺序。但在其他方案实施中,您不能依赖于此;有些方案使用从右到左的顺序,理论上,其他顺序是可能的。)

您说:

“它返回
12345(######)

这并不完全正确。这就是它打印/显示的内容;不是它返回的内容。您可以通过以下方式获得返回值:

> (define test (map display '(1 2 3 4 5)))
12345> test
(#<void> #<void> #<void> #<void> #<void>)
> 

但map会将列表中的每个元素发送到display,然后该元素将不会返回任何内容。我如何让显示器返回球拍中的空白?你是对的,前面的开括号是一个拼写错误,它会纠正的。谢谢@HatoriSanso您可以在我提供的链接上阅读规格。它表示“返回未指定的值”。例如,
display
确实会向调用它的函数返回一些值。同时一些输出也出现在一些控制台窗口中,这只是其操作的另一部分。您之所以看到它,是因为您在REPL处调用它,REPL也会打印最后返回的值。您还有一个问题要解决:
> (define test2 (display 1))
1> (list test2)
(#<void>)
>