Get Clojure-Argumentliste

8

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?

    
Stephen Cagle 14.09.2013, 03:00
quelle

6 Antworten

4

Zu der Zeit, zu der der Funktionskörper ausgeführt wird, wurden die Parameter bereits destrukturiert. Sie könnten Ihr eigenes Makro defn definieren und diese Werte anzeigen. Ich weiß, Lighttable tut dies in ihrem Instarepl, um die Argumentwerte anzuzeigen.

    
Jared314 14.09.2013 03:45
quelle
2

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.

    
bmaddy 15.09.2013 04:33
quelle
2

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.

    
Ivaylo Petrov 29.07.2015 12:13
quelle
1

Nicht sehr nett, da es erforderlich ist, params als Vektor zu übergeben, scheint aber apt

zu sein %Vor%     
FUD 14.09.2013 03:22
quelle
0

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.

%Vor%     
Stephen Cagle 15.09.2013 05:19
quelle
0

Sie können ein Makro verwenden, um die Argumente an das Symbol% ​​co_de% in diesem Beispiel zu binden.

%Vor%

Sie können dann _args im Körper von verwenden, um auf die Argumente zu verweisen:

%Vor%     
ChrisBlom 31.01.2017 09:51
quelle

Tags und Links