方案(我使用的球拍R5RS),当我把这个程序一个奇怪的事情发生方案中使用的地图,当我使用的显示功能
(map display '(1 2 3 4 5))
返回
12345(#<void> #<void> #<void> #<void> #<void>)
为什么就是它?怎么了虚空?
方案(我使用的球拍R5RS),当我把这个程序一个奇怪的事情发生方案中使用的地图,当我使用的显示功能
(map display '(1 2 3 4 5))
返回
12345(#<void> #<void> #<void> #<void> #<void>)
为什么就是它?怎么了虚空?
你说:
“返回12345(#<void> #<void> #<void> #<void> #<void>)
”
这是不正确地修正。那是什么打印/显示;不是什么它返回。您可以通过以下方式获得返回值:
> (define test (map display '(1 2 3 4 5)))
12345> test
(#<void> #<void> #<void> #<void> #<void>)
>
这里更清晰:“12345”已打印;返回值绑定到test
,是您的“空白”列表。
“空白”值的原因是map
将其函数应用于列表中的每个元素,并使用由函数返回的值构造一个新列表。对于display
,返回值为'void'。因此:
> (define test2 (display 1))
1> (list test2)
(#<void>)
>
map
收集列表中每个元素上每个函数调用的结果并返回这些结果的列表。
display
返回未指定的值。 #<void>
只是Racket正在使用的东西。它可能已经返回42。
您可能有一个错字。它应该已经返回
12345(#<void> #<void> #<void> #<void> #<void>)
没有开头括号。即五个值被显示,然后是返回值。
但地图发送列表中的每个元素来显示,然后不应该返回任何东西。我将如何让显示器在自己的球拍中返回void?你说得对,主要的左括号是一个错字,会解决它。谢谢! –
@HatoriSanso你可以阅读我提供的链接的规格。它说“返回未指定的值”。即'display'确实返回一些值 - 给调用它的函数。同时某些输出也出现在某个控制台窗口,这只是其操作的另一部分。你可以看到它,因为你在REPL中调用它,它也打印最后返回的值。 –
对于您的情况,您需要使用for-each
而不是map
。 for-each
是非收集的,不像map
。
此外,for-each
保证将列表项从左到右传递给您的函数。 map
不作任何保证,并且被允许以任何顺序通过列表项目。 (虽然在Racket的特定情况下,map
确实使用了从左到右的顺序,但是在其他Scheme实现中不能依赖此;有些使用从右到左的顺序,理论上也可以使用其他顺序。 )
你还有一个问题,关闭:http://stackoverflow.com/q/16733472/1286639 – GoZoner