在方案中(我正在使用球拍R5RS)
(map display '(1 2 3 4 5))
它返回
12345(#<void> #<void> #<void> #<void> #<void>)
为什么?虚空怎么了?
答案 0 :(得分: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
的返回值是您的“无效”列表。
'void'值的原因是map
将其函数应用于列表中的每个元素,并使用函数返回的值构造一个新列表。对于display
,返回值为“void”。就这样:
> (define test2 (display 1))
1> (list test2)
(#<void>)
>
答案 1 :(得分:0)
map
收集每个函数调用的结果,并返回列表中的每个元素。
display
返回未指定的值。 #<void>
只是Racket正在使用的东西。它本可以返回42。
你可能有一个错字。它本应该返回
12345(#<void> #<void> #<void> #<void> #<void>)
没有前导括号。即显示五个值,然后返回值。
答案 2 :(得分:0)
在您的情况下,您需要使用for-each
代替map
。与for-each
不同,map
是非收集的。
此外,for-each
保证将列表项从左向右传递给您的函数。 map
没有这样的保证,并且允许以任何顺序传递列表项。 (虽然,在Racket的特定情况下,map
确实使用从左到右的顺序。但是你不能在其他Scheme实现中依赖于此;有些使用从右到左的顺序,理论上,其他订单是可能的。)