方案(我使用的球拍R5RS),當我把這個程序一個奇怪的事情發生方案中使用的地圖,當我使用的顯示功能
(map display '(1 2 3 4 5))
返回
12345(#<void> #<void> #<void> #<void> #<void>)
爲什麼就是它?怎麼了虛空?
方案(我使用的球拍R5RS),當我把這個程序一個奇怪的事情發生方案中使用的地圖,當我使用的顯示功能
(map display '(1 2 3 4 5))
返回
12345(#<void> #<void> #<void> #<void> #<void>)
爲什麼就是它?怎麼了虛空?
你說:
「返回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>)
>
map
收集列表中每個元素上每個函數調用的結果並返回這些結果的列表。
display
返回未指定的值。 #<void>
只是Racket正在使用的東西。它可能已經返回42。
您可能有一個錯字。它應該已經返回
12345(#<void> #<void> #<void> #<void> #<void>)
沒有開頭括號。即五個值被顯示,然後是返回值。
但地圖發送列表中的每個元素來顯示,然後不應該返回任何東西。我將如何讓顯示器在自己的球拍中返回void?你說得對,主要的左括號是一個錯字,會解決它。謝謝! –
@HatoriSanso你可以閱讀我提供的鏈接的規格。它說「返回未指定的值」。即'display'確實返回一些值 - 給調用它的函數。同時某些輸出也出現在某個控制檯窗口,這只是其操作的另一部分。你可以看到它,因爲你在REPL中調用它,它也打印最後返回的值。 –
對於您的情況,您需要使用for-each
而不是map
。 for-each
是非收集的,不像map
。
此外,for-each
保證將列表項從左到右傳遞給您的函數。 map
不作任何保證,並且被允許以任何順序通過列表項目。 (雖然在Racket的特定情況下,map
確實使用了從左到右的順序,但是在其他Scheme實現中不能依賴此;有些使用從右到左的順序,理論上也可以使用其他順序。 )
你還有一個問題,關閉:http://stackoverflow.com/q/16733472/1286639 – GoZoner