2013-01-20 63 views
0

比方說,我有一個宏,宏裏面我有這讓:基本Clojure的語法

let[ 
    elements# //stuff// 
    #newlist (for [e# elements#] (if (number? e#) (**add e# to #newlist**))) 
] 

因爲我有一個很艱難的時間找到對的非常簡單的Clojure的東西正確的信息,我在這裏問:我需要做什麼來完成上述任務?我認爲它應該有可能做到這一點,但我不知道最關鍵的部分!

回答

2

它看起來像你想創建一個名爲newlist的列表,其中包含所有那些數字爲elements的元素。如果是這樣,你可以只使用filter功能是這樣的:

(let 
    [elements whatever 
    newlist (filter number? elements)] 
    do-stuff-with-newlist) 

filter需要一個謂語函數和一個列表,並返回一個包含該斷言返回一個真實結果這些項目一個新的列表。

請注意,您在for循環中添加到列表的初始想法不起作用,因爲列表是不可變的,所以您不能在原地添加它們。你可以重新分配一個變量,它包含一個for循環中的列表(類似於(set! my-list (cons e my-list)),但這不會是慣用的Clojure代碼,它也會創建相反的列表。)

+0

它肯定適用於數字嗎? (過濾器(實例?java.something)元素)只是說了一些關於「布爾不能投到clojurer.lang.IFn) – Deragon

+2

@Deragon從來沒有提到任何東西,因爲我認爲該實例?會工作,但它不會。 'filter'的參數需要是一個函數,而不是調用一個函數的結果,所以你應該創建一個單參數函數(無論是named還是anonymous),如果它的參數是一個'java.something'的實例,則返回true否則返回false – sepp2k

+0

例如(filter#(instance?java.something%)元素)將起作用。 – NielsK