2011-10-26 57 views
3

大師使用Clojure

函數式編程這裏有一個問題想問你:我對 是傳遞函數功能的Clojure的計劃工作。

我有類似:

(defn funct-op [args] 
     ((first args) 
     (second args) 
     (last args) ) 

(funct-op '(+ 2 2)) 

我怎樣才能哄本功能-OP到給我而非我 目前得到些什麼?當我的項目進行時,我可能需要將一個函數傳遞給宏。有關如何做到這一點的任何提示?謝謝你的幫助!

回答

4

爲了將'+'轉換爲函數,您可以使用解析。這應該適用於核心功能,但您可能需要使用ns解析自定義函數。然後,您可以使用apply將其餘參數傳遞給該函數。

(defn funct-add [args] (apply (resolve (first args)) (rest args)))

不知道你的最終目標確實是,但我認爲這是你要找的答案。

+0

+1指出'解析'! – 2011-10-26 15:51:51

+0

感謝您的解決方案。對我的最終目標的討論更適合於另一個問題(或者是否允許我嵌套問題)? – todun

4

什麼是funct-add真的是應該做什麼?如果是(funct-add '(- 2 2))

無論如何,考慮apply,甚至包裹起來:

(defn apply-wrapper [args] 
    (apply (first args) (rest args))) 

; note use of of the [...] form 
(apply-wrapper [+ 2 2]) ; => 4 
(apply-wrapper [- 2 2]) ; => 0 

比較這些形式可以有所啓發:

(+ 1 2) ; 3 
'(+ 1 2) ; (+ 1 2) 
[+ 1 2] ; [#<core$_PLUS_ [email protected]> 1 2] 

注意最後一個是如何評估;它不僅僅是一個「文字列表」 - 不再有任何符號! :-)

快樂編碼。

+0

'funct-add'應該採用一個_unevaluated列表arguments_,對它進行評估並得出結果。所以'(funct-add'( - 2 2))'會產生** 0 **。一般來說,'(funct-add'(binary-op operand1 operand2))',其中** binary-op **可以是** + **,** - **或任何帶有兩個參數的_operator_使用前綴符號。謝謝。 – todun

+1

@tscala我認爲關鍵是爲什麼「添加」的名稱,如果它不只是添加 –

+1

還請記住,您不必引用列表只是爲了不評估整個表單。如果你想評估的內容,但不是作爲函數調用的形式,你可以使用'list'。 '(list + 1 2)'。當然,使用矢量要好得多。 – Rayne

1

我不確定,這些東西?

(defn funct-op [f list] 
    (apply f list)) 

(funct-op + '(1 2));=>3