2016-12-31 3 views
1

lassen Sie uns sagen, dass in Clojure habe ich eine Liste wie folgt definiert:Verwenden Liste als Clojure Funktionskörper

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

Als nächstes möchte ich die function-body Liste als effektive Körper einer Funktion nutzen, so möchte ich zu tun, so etwas wie:

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

zu produzieren:

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

die gültige Clojure Dorsch e.

Ist das in Clojure möglich? Wenn ich zu Makro zurückkehren sollte, welche Art von Erweiterung sollte ich verwenden?

Antwort

1

Sie würden wahrscheinlich ein Makro dafür verwenden. Der Code, wie Sie es haben, würde nur die Liste '(+ a b) zurückgeben, keine Zugabe.

Auf eine andere Notiz, welches Problem versuchen Sie tatsächlich zu lösen? Ich verstehe nicht wirklich, warum du so etwas machen willst. Sie könnten die falsche Frage stellen.

+0

Ich versuche Gebäude der Funktion Körper und Funktion Deklaration zu entkoppeln. Aber ich verstehe, dass der einfachste Ansatz vielleicht darin besteht, die Liste in eine Fn-Deklaration zu packen und die vollständige Deklaration auszuwerten. Was denkst du darüber? –

+2

Zu welchem ​​Zweck versuchen Sie, das Erstellen eines Funktionskörpers und einer Funktionsdeklaration zu entkoppeln. – RedDeckWins

+0

Weil die Idee hier war, die Körper aus einer anderen Datenstruktur (d. H. Einer Karte) zu generieren und sie vielleicht zu manipulieren und sie dann in eine Funktionsdeklaration zu verpacken. Ich wollte Eval am Ende nicht verwenden, obwohl ich verstehe, dass Macro und Eval mir die Macht geben, alles zu tun, was ich will ... –

2

Ich bezweifle, dass Sie den Funktionskörper als Formular behalten müssen. Die Funktion selbst, (fn [a b] (+ a b)) in Ihrem Beispiel, ist als eine Sache, die Sie als ein Argument übergeben können, als Element in einer Datenstruktur, sowie die Funktion der Sache Argument Argumente aufrufen.

Ihr Zweck besteht wahrscheinlich darin, mehrere Funktionen zur Verfügung zu haben, die Sie je nach Umständen aufrufen können. Halte sie als Funktionen, nicht als Formen.

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

Schnell Erklärung:

; 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 

Ein Makro wäre sehr ähnlich, das heißt nur den Körper unquote.

+0

Ja, am Ende ist Eval dein einziger Freund für den einfachen dynamischen Code-Ladevorgang :) –

Verwandte Themen