Je nachdem, was Sie wollen, Sie dort zu tun gibt zwei Varianten:
Zuerst ein (die Sie wahrscheinlich wollen) ist:
(defmacro evalf [f v] `(~f ~v))
oder
(defmacro evalf [f v] (list f v))
Beide tun das gleiche: erzeugen Sie den s-Ausdruck, den Sie brauchen. Mit diesem würde (evalf + 10)
in Kompilierzeit zu (+ 10)
erweitert und dann in Laufzeit erfolgreich ausgewertet werden.
zweite ist dies:
(defmacro evalf [f v] ((resolve f) v))
Nun wird die Funktion f
würde zur Compile-Zeit aufgerufen werden, so würde Makro auf das Ergebnis erweitert werden: 10
Ihre Variante mit (f v)
gescheitert still , denn wenn Sie (evalf + 10)
anrufen, die +
hier ist nur ein einfaches Symbol, kein Verweis auf die Funktion aus der Sicht des Makros, so versucht esaufrufen, da das Symbol in clojure die Semantik der Funktion hat, ist es völlig korrekte Syntax, aber dieser Aufruf erzeugt nil
. (Das Beispiel des Symbolaufrufs: ('+ {'+ 10})
=> 10) Wenn Sie also die Funktion, benannt als dieses Symbol, erhalten wollen, müssen Sie sie wie in meinem zweiten Beispiel lösen.
Und die Variante mit '(f v)
erweitert gerade in die Liste der zwei Symbole: 'f
und 'v
, und führt dann zur Laufzeit Anruf ('f 'v)
, die auch nil
zurückgibt, wie die erste Variante.
Danke, beide sind Antworten, aber ich habe mehr deins verstanden, also habe ich das gewählt –