在方案中使用map,当我使用display函数时会发生奇怪的事情

时间:2013-05-30 12:13:39

标签: map scheme void r5rs

我打电话给这个程序时,

在方案中(我正在使用球拍R5RS)

(map display '(1 2 3 4 5))

它返回

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

为什么?虚空怎么了?

3 个答案:

答案 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实现中依赖于此;有些使用从右到左的顺序,理论上,其他订单是可能的。)