Ich habe versucht, xor Makro zu implementieren und kam mit einem Problem.Warum unterstützt Clojure nicht private Funktionen im Makro?
Ich konnte private Funktion in einem Makro nicht verwenden. Hier
ist das Beispiel:
private Funktion
Makro
(defmacro xor
([] true)
([x] x)
([x & next]
`(let [first# ~x
second# ~(first next)]
(if (= (count '~next) 1)
(xor-result first# second#)
(xor (xor-result first# second#) [email protected](rest next))))))
Hier ist die Fehler:
CompilerException java.lang.IllegalStateException: var: #'kezban.core/xor-result is not public
Problem löst wenn ich ^entfernen: privat Flagge.
Frage ist: Was ist der Grund für dieses Verhalten?
UPDATE: Ich private Funktion mit folgenden Ansatz verwenden kann.
private Funktion
(defn ^:private xor-result
[x y]
(if (and x y)
false
(or x y)))
neues Makro
(defmacro xor
([] true)
([x] x)
([x & next]
(let [first x
second `(first '([email protected]))
result (xor-result (eval first) (eval second))]
`(if (= (count '~next) 1)
~result
(xor ~result [email protected](rest next))))))
[ns1: beziehen [xor]] in diesem Codebeispiel. Worauf bezieht sich xor? –
Ahh, Tippfehler, behoben. –
Ich habe einen neuen Ansatz hinzugefügt, der private Funktionen verwendet. Kannst du bitte dieses Verhalten erklären? –