Ich möchte etwas, das mir die Folge von tatsächlichen Werten gibt, die an eine Funktion übergeben werden, ähnlich wie bei Argumente Wert in einer JavaScript-Funktion.
Ich bin mir bewusst, dass ich die gesamte Funktionsargumentliste mit
erfassen kann %Vor%Aber das beseitigt die Arität meiner Funktion. Ich möchte etwas wie
haben %Vor%Ist es möglich, eine Rohsequenz der an eine Funktion übergebenen Werte zu erhalten?
Ich weiß nicht, wie Sie das beschreiben können, aber je nachdem, was Sie tun möchten, gibt es einige Möglichkeiten.
Wenn Sie sicherstellen wollen, dass die Funktion nur mit zwei Argumenten aufgerufen wird, sollten Sie eine Vorbedingung berücksichtigen:
%Vor%Wenn Sie die beabsichtigte Funktion einer Funktion verfolgen möchten, aber trotzdem Zugriff auf einen Vektor aller Argumente haben, können Sie Ihre eigenen Metadaten hinzufügen:
%Vor%Wenn Sie nur Zugriff auf die destrukturierten Werte wünschen, die Sie beschrieben haben, und auf einen args-Wert zugreifen möchten, können Sie let:
verwenden %Vor%Sie können auch eine Kombination daraus machen.
Die Verwendung der Argumentzerstörung kann helfen. Das folgende funktioniert gut für mich (soweit ich weiß, funktioniert es auch für alte Versionen von clojure).
%Vor% Der entscheidende Punkt ist, dass Sie das Argument nach &
zerstören können. Der Nachteil ist, dass es möglich ist, die Funktion mit mehr Argumenten als erwartet aufzurufen (zum Beispiel ist (example 1 2 3)
ein gültiger Aufruf. Es sollte besondere Vorsicht walten gelassen werden, wenn dies ein Problem sein könnte.
Hinweis: Ich bin während der Suche nach ähnlichen Funktionen auf diese Frage gestoßen. Ich habe weiter gegraben und eine Idee aus hier und :as
as verwendet es wurde in diese Antwort vorgeschlagen, ich fand eine Lösung für mein Problem.
Das ist das Beste, was ich kochen könnte.
%Vor%Offensichtlich akzeptiert dies nicht die vollständigen Defn-Optionen (Metadaten, Docstring, Pre- und Post, Aritäten usw.), die an defn übergeben werden können, aber ich denke, es illustriert die Idee.
Er erfasst den args
Vektor und erstellt dann einen simple-args
Vektor mit derselben Länge wie das ursprüngliche args
, aber ohne Destrukturierung; Verwenden Sie das als% Co_de% Argumentvektor. Dann massiert er diesen defn
Vektor in eine Art flachen Vektor ohne simple-args
, den er &
zuweist. *arguments*
wird dann unter Verwendung des ursprünglichen Vektors *arguments*
destrukturiert. Art von verschachtelt, aber es tut, was ich im Moment will.
Tags und Links clojure