2016-02-05 72 views
2

我想知道爲什麼在clojure輸出結束時會出現「nil」。這裏是我的代碼:爲什麼clojure在輸出結束時會出現「nil」

(defn foo [x &argu] 
    (print x &argu)) 

而另一個問題是,什麼是「&申辯」這裏的意思?一個可變參數或什麼?非常感謝!

+0

當我運行(foo 3「hello」)時,它出來3hellonil –

+0

'print'在最後沒有'換行',這就是爲什麼輸出只是在之前輸出的東西之後進行的原因。只有在特殊情況下才需要「打印」。使用'println'的做法更爲常見,它有一些不錯的格式。 –

回答

9

REPL(或您正在使用的任何執行環境)可讓您知道代碼評估的輸出。正如你寫的那樣,你的函數不會返回任何東西。在這種情況下,按照慣例返回nilnil是Clojure的標記nothing/null。你所有的代碼都在印刷 - 這是一種「副作用」。

重要的是要注意,nil在Clojure中是一個合適的值。這與一些甚至不允許您將undefined/unknown值與另一個值相比的語言進行比較 - 這樣做會產生異常。

通常有一個空間,所以[x & argu]。它很重要 - 所以請在代碼中放置空格,然後重試。這意味着該函數需要一個或多個參數。你說這是'可變的',是非常正確的。

大多數語言都有'無'和'可變參數'的概念。由於Clojure是一種功能性語言,因此從功能中「迴歸」的整個思想變得非常重要。在代碼中優先考慮沒有副作用可以使得推理更容易。

這是你的函數改變一點點:

(defn foo [x & argu] 
    (println x argu)) 

而且這是在REPL用法示例:

=> (foo 3 "Hello" "how" "are" "you?") 
3 (Hello how are you?) 
nil 

如何看功能argu裏面已經成爲一個list

+1

*你的函數不返回任何東西*更好地說,一個空的函數體評估爲['nil'](https://clojure.org/reference/data_structures#nil),這是Clojure中的一個合適的值,通常返回在沒有任何其他價值的情況下。如果它的意思是* undefined *,那麼測試它的平等性將會是可疑的。 – Thumbnail

相關問題