2016-12-31 3 views
1

のは、Clojureの中で、私はこのように定義されたリストを持っているとしましょう:使用リスト

(def function-body '(+ a b)) 

次私は機能の効果的なボディとしてfunction-bodyリストを使用したいと思いますので、私は希望

(defn my-sum [a b] function-body) 

が生成する:

(defn my-sum [a b] (+ a b)) 

有効なClojureのタラがあるような何かをしますe。

Clojureではこれが可能ですか?マクロに戻す必要がある場合は、どのような拡張を使用する必要がありますか?

答えて

1

おそらく、このためにマクロを使いたいと思うでしょう。あなたが持っているコードは、リストを返すだけです'(+ a b)、何も追加しません。

別の問題として、あなたは実際にどのような問題を解決しようとしていますか?私はなぜあなたがこのようなことをしたいのか分からない。あなたは間違った質問をしているかもしれません。

+0

私は、関数本体と関数宣言の構築を切り離そうとしています。しかし、私はおそらく、最も簡単なアプローチは、fn宣言にリストをラップし、完全宣言を評価することだと思います。あなたはこのことについてどう思いますか? –

+2

関数本体と関数宣言の構築をどのような目的でデカップリングしようとしていますか? – RedDeckWins

+0

ここでのアイデアは、別のデータ構造体(つまりマップ)からボディを生成し、それらを操作して関数宣言でラップすることだったからです。私は最後にevalを使用しないことを望んでいましたが、マクロと評価が私に必要なすべてを行う力を与えることを理解していますが... –

2

私はあなたがフォームとして関数本体を保持する必要があるとは思っていません。あなたの例では、関数自体((fn [a b] (+ a b)))は、引数として渡すことができ、データ構造の要素として採用することができ、引数を呼び出す関数を実行することもできます。

あなたの目的は、場合によっては、あなたが電話する可能性のあるいくつかの機能を使用することです。フォームとしてではなく、機能としてそれらを保つ。

1
(def function-body '(+ a b)) 
(eval `(defn ~'my-sum ~'[a b] ~function-body)) 

クイック説明:

; what we eval above is this: 
`(defn ~'my-sum ~'[a b] ~function-body) 
; which becomes this: 
; (clojure.core/defn my-sum [a b] (+ a b)) 
(my-sum 2 3) ; => 5 

マクロは非常に類似して、すなわち、ちょうど体をUNQUOTE。

+0

はい、最終的にEvalは簡単な動的コードロードのための唯一の友人です:) –

関連する問題