Ich habe eine beliebige Anzahl von Listen, die ich mit dem for-Makro bearbeiten möchte. Ich möchte eine Funktion erstellen, die einen Vektor als Bindung übergibt, da die Anzahl der Listen variiert.
Wenn ich die Bindung fest codiere, funktioniert es wie erwartet:
%Vor%Wenn ich versuche, einen Vektor separat zu erstellen und diesen als Bindung zu verwenden, treffe ich Probleme. Hier erstelle ich manuell den Bindungsvektor:
%Vor%das scheint in Ordnung zu sein:
%Vor%Allerdings
%Vor%Ich verstehe nicht, warum Testvektor nicht als Vektor betrachtet wird, wenn er als Bindeglied verwendet wird. Wenn ich Strohhalme greife, lege ich testvector in eckige Klammern, was das Makro für glücklich hält (es sieht einen Vektor), aber jetzt habe ich einen Vektor mit einem Element (dh einen Vektor innerhalb eines Vektors) und das funktioniert nicht, weil die Bindung es braucht sind Paare aus Name und Sammlung.
%Vor%Irgendwelche Vorschläge, wie Sie einen Vektor dynamisch als Bindung an for übergeben können, wären willkommen.
Der Schlüssel ist, dass für ein Makro ist. Bei der Makroexpansionszeit ist Testvektor ein Symbol. Es wird bei der Auswertung zu einem Vektor ausgewertet, aber es ist kein Vektor aus der Perspektive des Makros für .
%Vor%Wenn Sie die Quelle für das Makro für (in core.clj) überprüfen, sehen Sie, dass für einen nicht angegebenen Vektor verwendet? Rufen Sie wie im obigen Beispiel tst auf.
Obwohl es sich nicht um eine Lösung für Ihr Problem handelt, sollte beachtet werden, dass das, was Sie tun, leichter mit der Karte als beispielsweise für
erreicht werden kann %Vor%Eine weitere nützliche Technik beim Lernen und Experimentieren ist die Verwendung von Schlüsselwörtern anstelle von Strings. Dies kann die Typisierung verringern, d. H. Es ist nicht erforderlich, die Werte in Anführungszeichen zu setzen, und kann manchmal dazu beitragen, Fehler leichter zu identifizieren. Statt (def list1 '("pink" "grün")) kannst du einfach (def list1' (: pink: grün)). Noch besser, anstatt Listen zu verwenden, versuchen Sie es mit Vektoren und dann müssen Sie es nicht zitieren (Speichern eines anderen Tastendrucks).
Sie können versuchen, die Auswertung des Bindungsvektors zu erzwingen. Anstatt zu versuchen, ein Makro zu definieren, das das Makro for
umschließt, wickle es in eine Funktion, z. B.
Dann können Sie tatsächlich einen Bindungsvektor mit ein paar zusätzlichen Einschränkungen erstellen, da alle s-Ausdrücke innerhalb des Bindungsvektors gültig sein müssen und ein Verb als erstes Element enthalten müssen.
%Vor%Und mit Ihrem Beispiel:
%Vor% Hinweis: Da for-fn
eine Funktion ist, müssen Sie den Ausdruck (str A "-" B)
angeben, um eine frühzeitige Auswertung zu verhindern (bevor A & amp; B gebunden sind).
Tags und Links clojure binding list-comprehension