Warum sollte ich "anwenden" in Clojure verwenden?
Dies ist, was Rich Hickey sagte in einem blog-posts, aber ich verstehe nicht die motivation für die Verwendung gelten. Bitte helfen Sie.
Einen großen Unterschied zwischen Clojure und CL ist, dass Clojure ist ein Lisp-1, so funcall ist nicht nötig, und gelten nur für die Anwendung einer Funktion auf einen Laufzeit-definierte Sammlung von Argumenten. So, (f [i]) geschrieben werden kann (f i).
Auch nicht, was er meine mit "Clojure ist Lisp-1" gebunden und anschliessend nicht benötigt wird? Ich habe noch nie programmiert in CL.
Dank
InformationsquelleAutor der Frage unj2 | 2009-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie geltenwenn die Anzahl der Argumente übergeben werden, die Funktion ist nicht bekannt zur compile-Zeit (sorry, weiß nicht, Clojure syntax alle, die gut zu Hilfenahme Schema):
Solange die Anzahl der Argumente, die zur Kompilierzeit bekannt ist, können Sie passieren Sie direkt, wie im Beispiel oben. Aber wenn die Zahl der Argumente ist nicht bekannt, zur compile-Zeit, die Sie dies nicht tun (gut, Sie könnten versuchen, so etwas wie):
aber, dass wird ein Alptraum bald genug. Das ist, wo gelten ins Bild:
Dauert es, beliebige Zahl von Argumenten enthalten sind in der Liste als letztes argument, und ruft die übergebene Funktion als erstes argument an gelten mit diesen Werten.
InformationsquelleAutor der Antwort Dirk
Den Bedingungen Lisp-1 und Lisp-2 Lesen Sie, ob Funktionen im selben namespace wie Variablen.
In ein Lisp-2 (2-namespaces), das erste Element in einer form ausgewertet werden, da eine Funktion Namen — auch wenn es eigentlich der name einer Variablen mit einem Wert für die Funktion. Also, wenn Sie wollen, nennen Sie eine variable Funktion, die Sie haben, zu übergeben der variable an eine weitere Funktion.
In einem Lisp-1, wie Scheme und Clojure, die Variablen zu bewerten, dass um die Funktionen gehen kann in der anfänglichen position, so dass Sie nicht brauchen, um verwenden
apply
um zu bewerten, als eine Funktion.InformationsquelleAutor der Antwort Chuck
apply
im Grunde packt eine Sequenz und die Funktion anwendet, um Sie als einzelne Argumente.Hier ist ein Beispiel:
Zurückgibt, 15. Es ist im Grunde erweitert, um
(+ 1 2 3 4 5)
statt(+ [1 2 3 4 5])
.InformationsquelleAutor der Antwort Rayne
Verwenden Sie
apply
zu konvertieren, eine Funktion, die auf mehrere Argumente an, dass ein Werk auf eine Folge von Argumenten. Sie können auch legen Sie die Argumente, bevor Sie die Sequenz. Zum Beispielmap
kann die Arbeit auf mehrere Sequenzen. Dieses Beispiel (von ClojureDocs) verwendetmap
zu transponieren einer matrix.Den man eingefügt argument ist hier
vector
. Also dieapply
erweitert, umSüß!
PS Rückkehr ein Vektor von Vektoren anstelle von einer Sequenz von Vektoren, wickeln Sie das ganze in
vec
:Während wir hier sind,
vec
könnte definiert werden als(partial apply vector)
obwohl er es nicht ist.Über Lisp-1 und Lisp-2: die 1 und 2 zeigen die Anzahl der Dinge, die einen Namen bezeichnen, die in einem bestimmten Kontext. In ein Lisp-2 können Sie zwei verschiedene Dinge (eine Funktion und eine variable) mit dem gleichen Namen. Also, überall dort, wo entweder gültig, Sie müssen dekorieren Sie Ihr Programm mit etwas angeben, welche du meinst. Zum Glück, Clojure (oder-Schema,...) können Sie einen Namen bezeichnen, nur eine Sache, also keine solche Dekorationen erforderlich sind.
InformationsquelleAutor der Antwort Thumbnail
Dem üblichen Muster gelten für Typ-Operationen ist die Kombination von einer Funktion zur Laufzeit mit einem Satz von Argumenten, dito.
Ich habe nicht genug getan, mit clojure in der Lage sein, zuversichtlich in die Feinheiten für die jeweilige Sprache zu sagen, ob die Nutzung gelten in diesem Fall wäre es unbedingt nötig ist.
InformationsquelleAutor der Antwort Steve Gilham
Anwenden ist sinnvoll, die Protokolle, vor allem in Verbindung mit dem Durchzug von Makros. Ich habe gerade entdeckt diese. Da Sie kann nicht in der & makro erweitern Sie die Schnittstelle Argumente bei der Kompilierungdie Sie anwenden können, eine unvorhersehbar große Vektor statt.
Also ich benutze diese, zum Beispiel als Teil einer Schnittstelle zwischen einem Datensatz-holding einige Metadaten zu einer bestimmten xml-Datei und die Datei selbst.
text-id-to-tree
ist eine weitere Methode von diesem bestimmten Datensatz Parsen einer Datei in eine xml-Reißverschluss. In einer anderen Datei, ich erweitere das Protokoll mit einer bestimmten Abfrage, implementiertquery-tree
Angabe eine Kette von Befehlen, um sein Gewinde durch die xml-> makro:(Hinweis: diese Abfrage selbst gibt eine Menge von "null" Ergebnisse für tags, die nicht
Attribute. Filter und reduzieren die für eine saubere Liste der einzigartigen Werte).
zf, die durch die Art und Weise, bezieht sich auf clojure.contrib.zip-filter und zip clojure.zip. Die xml-> das makro wird aus der clojure.contrib.zip-filter.xml Bibliothek, die ich
:use
InformationsquelleAutor der Antwort tborg