2015-08-30 29 views
2

我在REPL中使用了序列,並遇到以下行爲,至少在我看來,這很不直觀。所以我評估表達(cons '("1" "2") "3")期望它產生(("1" "2") "3"),但取而代之的是產生(("1" "2") \3)爲什麼Clojure強制字符串與字符

有人可以解釋爲什麼在這種情況下,Clojure自動強制stringcharacter?我認爲這與字符串的內部表示形式有關。

+0

'cons'強制字符串,而不是一個字符,而是字符* seq uence *。 – Thumbnail

回答

4

的第二個參數是cons的序列:

(利弊X SEQ)

返回一個新的SEQ其中x是所述第一元件和seq是 其餘部分。

現在你應該知道,如果你不給它,clojure會自動爲你創建一個序列。例如,調用seq(其中cons確實爲你)會告訴你該字符串轉換成字符序列:

else if(coll instanceof CharSequence) 
    return StringSeq.create((CharSequence) coll); 

相反,如果你想:

(seq "32") 
=> (\3 \2) 

這是由Clojure的runtime in RT.java完成字符被視爲一個單一的項目然後你可以包裝它:

(cons '("1" "2") '("3")) 
=> (("1" "2") "3") 
0

它不強制將字符串強制轉換爲字符,而是將字符串強制轉換爲字符序列,因爲第二個參數必須是集合。

cons將一個項目作爲其第一個arg,將一個集合作爲第二個。該集合被強制爲通過seq函數的列表。

user=> (seq "3") 
(\3) 

如果你想使用cons預先設置列表("1" "2")榜上有名("3")那麼你可以做如下:

user=> (cons '("1" "2") '("3")) 
(("1" "2") "3") 

也許你想(("1" "2") . "3"),那種非列表利弊你可以做其他口頭禪,但Clojure根本沒有這種類型的利弊。

相關問題