2013-05-30 44 views

回答

2

你说:

“返回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>) 
> 
0

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

display返回未指定的值。 #<void>只是Racket正在使用的东西。它可能已经返回42。

您可能有一个错字。它应该已经返回

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

没有开头括号。即五个值被显示,然后是返回值。

+0

但地图发送列表中的每个元素来显示,然后不应该返回任何东西。我将如何让显示器在自己的球拍中返回void?你说得对,主要的左括号是一个错字,会解决它。谢谢! –

+0

@HatoriSanso你可以阅读我提供的链接的规格。它说“返回未指定的值”。即'display'确实返回一些值 - 给调用它的函数。同时某些输出也出现在某个控制台窗口,这只是其操作的另一部分。你可以看到它,因为你在REPL中调用它,它也打印最后返回的值。 –

0

对于您的情况,您需要使用for-each而不是mapfor-each是非收集的,不像map

此外,for-each保证将列表项从左到右传递给您的函数。 map不作任何保证,并且被允许以任何顺序通过列表项目。 (虽然在Racket的特定情况下,map确实使用了从左到右的顺序,但是在其他Scheme实现中不能依赖此;有些使用从右到左的顺序,理论上也可以使用其他顺序。 )