In Clojure werden die Variablen durch with-local-vars
zugänglich durch Schließung definiert?Clojure mit-local-Vars in Schließung
Betrachten Sie das folgende Beispiel:
(defn foo []
(with-local-vars [bar 10]
(fn [] @bar)))
((foo))
Ergebnis ist die folgende: (. Stattdessen ich erwartete 10
zu bekommen)
#object[clojure.lang.Var$Unbound 0x131f68d8 "Unbound: #<Var: --unnamed-->"]
C. F. mit folgendem:
(defn foo []
(with-local-vars [bar 10] @bar))
(foo)
Ergebnis: 10
.
Basierend auf der documentation, ist es mir nicht klar, ob es gültig ist, lokale Vars in Clojure wie oben zu verwenden, aber ich würde vermuten, dass die Antwort nein ist. Kannst du das bitte bestätigen (oder widerlegen und erklären, was ich im ersten Beispiel falsch mache)? Und wenn meine Annahme klar ist (d. H., Dass lokale Variablen nicht in der Schließung verwendet werden können), dann erkläre, was der Grund dafür ist?
EDIT: für die Datensätze, this is the problem I was trying to solve.
Danke für die schnelle Antwort, scheint dies in der Tat der richtige Weg zu sein, der Verwendung von lokalen Variablen in die Schließung. Es ist schön, etwas Neues zu lernen :) Unglücklicherweise löst es mein ursprüngliches Problem nicht, da es so aussieht, als ob der Wert der lokalen Variablen bei jedem Aufruf der zurückgegebenen Funktion "zurückgesetzt" wird (siehe auch die verknüpfte CodeReview - Frage in die EDIT für Details). – Attilio
@Attilio - Es ist mir nicht klar, was Ihr erwartetes Verhalten ist (in Ihrer anderen Frage). Was, wenn Sie nur die 'mit-lokalen-vars' in Ihrer' logfun' Definition mit '(lassen Sie [depth (atom 0)] ...) ersetzen? Liefert das das Verhalten, nach dem Sie suchen? Wenn nicht, können Sie versuchen, das 'let' * außerhalb * des' defn logfun' zu verschieben (wodurch 'logfun' über' Tiefe' schließen kann, ohne es zu einer globalen Definition zu machen). – DaoWen