2013-05-30 73 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實現中不能依賴此;有些使用從右到左的順序,理論上也可以使用其他順序。 )