Clojure: lassen Sie Umfang und Funktion Rückgabewert
Ich bin mit einigen Schwierigkeiten, herauszufinden, wie Sie mithilfe der "let" - form. In dem nachfolgenden Beispiel, möchte ich lokal binden den Wert "cols" um zu arbeiten, später in der Funktion. Was ich Bemerke jedoch, dass, wenn ich "lass" die Funktion sel-opt-tmp gibt einen null-Wert und nicht als eine Liste.
(defn sel-opt-tmp []
(let [cols "test"]))
(prn (sel-opt-tmp))
*Der obige code liefert einen null-Wert.
Ich verstehe, dass "lassen" bindet nur einen Wert im Bereich einer Funktion, was ich nicht weiß ist ob es einen Weg gibt, um übergeben Sie den Wert aus der let-Bereich. Vielleicht gibt es so etwas wie "return", die mir nicht bekannt sind? Oder ist das einfach schlechtes design und sollte ich nicht die Bindung überhaupt, die in diesem Fall (dieser neigt zu langen Ketten von Funktionen, die schwierig zu Lesen, obwohl)?
- Die
let
form implizit gibt der Letzte Ausdruck enthält, welche in Ihrem Fall ist die unsichtbarenil
. Sie benötigencols
im Körper deslet
form zu haben, es zurückgegeben. "let" only binds a value in the scope of a function
- das ist nicht ganz richtig.let
s erscheinen fast überall, und den Umfang der gebundenen Namen ist dielet
Ausdruck.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt null, weil die Inhalte der let-Anweisung ist leer (oder null). Versuchen:
(let [cols "test"] cols)
Wird wieder der Wert von
cols
. Wie seh sagt, ein let-Anweisung wertet den Wert des letzten sub-expression.let
form ist selbst ein Ausdruck, der wertet aus, um den Wert seiner letzten sub-Ausdruck!Es gibt kein solches problem mit der übergabe von Werten außerhalb des Bereichs, wie Sie erwähnen. Die Bindung
cols
ist in Kraft, nur im Rahmen, aber die Lebensdauer der Wert von(:ks cols)
ist nicht in gleicher Weise eingeschränkt. (Das ist, warum Sie haben-garbage-collection: Sie können Werte zurückgeben, die Punkt-zu-Daten, und die Daten bleiben so lange Leben, wie es Referenzen.)Wenn man null von der Funktion, dass wahrscheinlich bedeutet, dass
cols
keinen:ks
Schlüssel... oder vielleicht doch nicht eine Karte. Dacols
ist das Ergebnis vonfilter
es ist eine Sequenz, und wenn die:ks
- Schlüsselwort verwendet wird, als eine Funktion, es gibt nil für nicht-Sammlungen. Zum Schutz gegen diese Art von bugs kann es eine nützliche Konvention zu schreiben immer(cols :ks)
statt(:ks cols)
so, dass Sie eine Fehlermeldung erhalten, wenn das, was Sie denken, ist eine Karte, ist etwas anderes.