2013-07-22 47 views
2
(map #(words %) indexes) 

單詞是字符串的向量,索引是一個非負整數的序列。我明白#(...)是一個匿名函數,%代表它的參數。我認爲這個想法是在指定的索引處獲得單詞,但是有人可以將匿名函數重寫爲更容易理解的函數嗎?Clojure代碼的這一行是做什麼的?

回答

3

如果我理解正確的話,你必須:

(def words ["who" "what" "where" "when"]) 
(def indexes (range 4)) 
(map #(words %) indexes) 
    => ("who" "what" "where" "when") 

一個關於Clojure的好東西是標準數據結構也是其成員的功能。這意味着以下內容是等效的:

(get words 1) 
    => "what" 
(words 1) 
    =>"what" 

這也適用於地圖和集合。前者取一個鍵並返回值。後者在列表中查找參數,如果找到或返回nil。

+1

+1擊敗了我,並有更好的解釋! –

+0

感謝您的評論! –

3

這只是一個不好的寫(map words indexes)的方法。我不知道函數words的功能或indexes的值是多少,但此代碼在indexes的每個元素上調用函數words,並返回一個結果序列。

+0

字(一個懶惰的序列)不,雖然一個函數,它的一個字符串的矢量。 – user1136342

+0

@ user1136342關鍵字'vector',它不是一個函數,但是實現了'Ifn'接口。如果你在原文中使用過這個例子,我們就不用猜了!但是,這個答案仍然是正確的。匿名函數不是必需的,只是'(地圖詞索引)'由於'Ifn'的實現爲'get'的'vector's。 –

+0

@ A.Webb,我用「不是一個函數」來說明:它絕對*是一個函數,因爲它實現了'IFn'。它只是用'[]'而不是'(fn ...)'定義的一個。 – amalloy

2
(def words ["apple" "banana" "cantaloupe" "date" "fig"]) 

(ifn? words) ;=> true 

(words 0) ;=> "apple" 
(words 1) ;=> "banana" 

是相當於

(get words 0) ;=> "apple" 
(get words 1) ;=> "banana" 

所以

(map #(words %) [0 1]) 

相當於

((get words 0) (get words 1)) 
+1

對於向量'v','(v x)'不嚴格等於'(get v x)'。具體來說,如果'x'不是一個整數,或者超出'v'的索引範圍,'(v x)'將拋出異常,而'(get v x)'將返回nil。 – amalloy