-1

当我调用此程序时,在方案中(我正在使用球拍 R5RS)

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

它返回

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

这是为什么?虚空是怎么回事?

4

3 回答 3

2

You said:

"it returns 12345(#<void> #<void> #<void> #<void> #<void>)"

which isn't precisely correct. That is what it prints/displays; not what it returns. You get the return value with:

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

Here it is clearer: '12345' was printed; the return value, bound to test, is your 'void' list.

The reason for the 'void' values is that map applies its function to each element in the list and constructs a new list with the value returned by function. For display the return value is 'void'. As such:

> (define test2 (display 1))
1> (list test2)
(#<void>)
> 
于 2013-05-30T14:57:36.003 回答
0

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

display返回一个未指定的值。#<void>只是 Racket 正在使用的东西。它也可以返回 42。

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

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

没有前导左括号。即播放五个值,然后返回值。

于 2013-05-30T12:24:56.043 回答
0

在您的情况下,您需要使用for-each而不是map,。for-each是非收集的,不像map.

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

于 2013-05-30T13:46:28.293 回答