Wann '(oder Zitat) in Lisp verwenden?
Nachdem es durch die wichtigsten Teile eines einführenden Lisp-Buch, ich konnte immer noch nicht verstehen, was die speziellen operator (quote)
(oder gleichwertig '
) - Funktion funktioniert, doch dies wurde ganzen Lisp-code, den ich gesehen habe.
Was tut es?
InformationsquelleAutor der Frage Cristián Romo | 2008-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort
Umgehen der Standard-Auswertung Regeln und tun nicht bewerten Sie den Ausdruck (symbol oder s-exp), übergeben Sie es zusammen, um die Funktion genau so, wie eingegeben.
Lange Antwort: Die Standard-Bewertung-Regel
Wenn eine regelmäßige (komme ich später) - Funktion aufgerufen wird, werden alle Argumente übergeben werden, ausgewertet werden. Das heißt, Sie können schreiben:
Was wiederum wertet
(+ a 2)
Bewertunga
und 2. Der Wert des symbolsa
gesucht wird in der aktuellen Variablenwerten festlegen, und dann ersetzt. Sagena
ist derzeit gebunden an den Wert 3:Würden wir bekommen
(+ 3 2)
+ ist dann aufgerufen wird, auf 3 und 2 nachgeben-5. Unsere ursprünglichen form ist jetzt(* 5 3)
nachgeben 15.Erklären
quote
Schon!In Ordnung. Wie oben gesehen, alle Argumente einer Funktion ausgewertet werden, so dass, wenn Sie möchten, übergeben Sie die symbol
a
und nicht Wert, die Sie nicht wollen, um Sie zu bewerten. Lisp-Symbole verdoppeln können sowohl als Ihre Werte und Marken, wo Sie in anderen Sprachen verwendet hätte Saiten wie Tasten auf hash-Tabellen.Dies ist, wo
quote
kommt. Sagen Sie den zu plottenden Ressourcenzuordnungen aus einer Python-Anwendung, sondern tun das Plotten in Lisp. Haben Sie Ihre Python-app, die so etwas tun:Geben Sie die Ausgabe so Aussehen (leicht prettyfied):
Erinnern, was ich sagte über
quote
("tick"), wodurch die default-Regel nicht anwenden? Gut. Was würde sonst passieren, dass die Werte derallocate
undfree
gesucht werden, und das wollen wir nicht. In unserem Lisp, wir wollen zu tun:Für die Daten, die oben gegeben werden, die folgende Abfolge von Funktionsaufrufen würde gemacht worden:
Aber Was
list
?Gut, manchmal tun auswerten wollen, die Argumente. Angenommen, Sie haben eine nette Funktion die Manipulation einer Zahl und einem string-und die Rückgabe einer Liste mit den daraus resultierenden ... Dinge. Let ' s make a false start:
Hey! Das ist nicht das, was wir wollten. Wir wollen selektiv bewerten einige Argumente, und lassen Sie die anderen Symbole. Versuch #2!
Nicht Nur
quote
Aberbackquote
Viel besser! Übrigens, dieses Muster ist so Häufig in der (meist) Makros, die es gibt eine spezielle syntax für genau das zu tun. Die backquote:
Es ist wie mit
quote
aber mit der option explizit bewerten einige Argumente, indem Sie Sie mit Kommas. Das Ergebnis entspricht der Verwendunglist
aber wenn Sie die Generierung von code aus einem makro, das Sie oft nur ausgewertet werden soll, kleine Teile des Codes, der zurückgegeben wird, so dass die backquote ist besser geeignet. Für kürzere Listenlist
kann mehr lesbar.Hey, Sie Vergessen, Über
quote
!So, wohin führt uns das? Ach, was tut
quote
eigentlich tun? Es gibt lediglich das argument(s) ungewichtete! Denken Sie daran, was ich am Anfang gesagt habe über die normalen Funktionen? Stellt sich heraus, dass einige Operatoren/Funktionen müssen nicht bewerten Sie Ihre Argumente. Wie WENN-Sie würde nicht wollen, dass der else-Zweig ausgewertet werden, wenn es nicht genommen, richtig? So genannte spezielle Operatorenzusammen mit Makros, wie das funktioniert. Besondere Operatoren sind auch das "axiom" der Sprache-minimal-Regeln--, auf die Sie implementieren können, der rest von Lisp durch die Kombination von Ihnen zusammen in unterschiedlicher Weise.Zurück
quote
:Vergleichen (auf Stahl-Bank Common Lisp):
Weil es keine
spiffy-symbol
im aktuellen Bereich!Zusammenfassend
quote
backquote
(mit Komma)list
sind einige der Werkzeuge, die Sie verwenden, um Listen zu erzeugen, die nicht nur Listen von Werten, aber wie Sie sehen können verwendet werden als leichte (keine Notwendigkeit, zu definieren, einestruct
) Daten-Strukturen!Wenn Sie mehr erfahren möchten, empfehle ich Peter Seibel ' s Buch Practical Common Lisp für einen praktischen Ansatz für das lernen Lisp, wenn Sie bereits in der Programmierung im großen. Schließlich auf Ihrem Lisp-Reise, beginnen Sie mit Paketen zu. Ron Garret ist Der Idiot ' s Guide to Common Lisp-Pakete geben Ihnen gute Erklärung.
Happy hacking!
InformationsquelleAutor der Antwort Mikael Jansson
Heißt es "don' T beurteilen mich". Zum Beispiel, wenn Sie wollten, um eine Liste zu verwenden als Daten und nicht als code, Sie legten ein Angebot vor. Zum Beispiel,
(print '(+ 3 4))
prints "(+ 3 4)", in der Erwägung, dass(print (+ 3 4))
Drucke "7"InformationsquelleAutor der Antwort Adam Rosenfield
Anderen Menschen, die diese Frage beantwortet haben, bewundernswert, und Matthias Benkard bringt eine ausgezeichnete Warnung.
NICHT VERWENDEN, ZITIEREN, ERSTELLEN VON LISTEN, DAS SIE SPÄTER ÄNDERN. Die spec erlaubt es dem compiler zu behandeln, zitiert die Listen als Konstanten. Oft ist ein compiler optimieren Konstanten durch die Schaffung einer einzigen für die Erinnerung und dann auf, dass single-Wert aus allen Orten, wo die ständige erscheint. In anderen Worten, es kann behandeln die Konstante wie eine anonyme Globale variable.
Dies kann zu offensichtlichen Problemen. Wenn Sie ändern eine Konstante ist, kann es sehr wohl ändern, andere Anwendungen von der gleichen Konstanten in völlig anderen code. Zum Beispiel, können Sie vergleichen einige variable '(1 1) in eine Funktion, und in einer ganz anderen Funktion, starten Sie eine Liste mit '(1 1) und fügen Sie dann mehr Zeug zu. Bei der Ausführung dieser Funktionen können Sie feststellen, dass die erste Funktion entspricht nicht der Dinge mehr richtig, weil es jetzt versucht zu vergleichen die variable zu '(1 1 2 3 5 8 13), was die zweite Funktion zurückgegeben. Diese zwei Funktionen sind völlig unabhängig, aber Sie haben eine Wirkung auf einander, weil die Verwendung von Konstanten. Noch verrückter schlechte Effekte kann passieren, wie eine ganz normale Listen-iteration plötzlich unendliche Schleife.
Verwenden, zitieren, wenn Sie benötigen eine ständige Liste, wie für den Vergleich. Verwenden Sie die Liste, wenn Sie ändern das Ergebnis.
InformationsquelleAutor der Antwort Xanthir
Einer Antwort auf diese Frage sagt, dass ZITAT "erstellt Liste Datenstrukturen". Das ist nicht ganz richtig. ZITIEREN ist fundamentaler als dieses. In der Tat, ZITAT ist ein trivialer operator: Sein Zweck ist die verhindern etwas überhaupt passiert. Insbesondere, es schafft nichts.
Was (QUOTE X) sagt, ist im Grunde "nichts tun, nur gib mir x". X muss nicht eine Liste wie in (QUOTE (A B C)) oder ein symbol wie in (ZITAT FOO). Es kann sich um ein beliebiges Objekt, was auch immer. In der Tat, das Ergebnis der Auswertung der Liste, die erzeugt wird, indem Sie (LIST 'QUOTE SOME-OBJEKT) wird nur immer wieder EINIGE-OBJEKT, was immer es ist.
Nun, der Grund dafür, dass (QUOTE (A B C)) scheint so, als ob es erstellt eine Liste, deren Elemente A, B, und C ist, dass eine solche Liste wirklich ist, was es gibt; aber an der Zeit, das ZITAT form ausgewertet, die Liste hat in der Regel bereits in der Existenz für eine Weile (als eine Komponente des QUOTE-form!), erstellt entweder der Lader oder die reader vor der Ausführung des Codes.
Eine Folge davon, dass neigt dazu, Reise, Anfänger, relativ Häufig ist, dass es sehr unklug sei, zu ändern, wird eine Liste zurückgegeben, die von einem Angebotsformular. Daten zurückgegeben ANGEBOT ist, für alle Absichten und Zwecke, als Teil der code ausgeführt wird und sollte daher behandelt werden als nur-Lesen -!
InformationsquelleAutor der Antwort Matthias Benkard
Die quote verhindert die Ausführung oder Auswertung von form -, Dreh es, statt in Daten. Im Allgemeinen führt man die Daten dann eval ' Ing.
Angebot erstellt Liste mit Datenstrukturen, zum Beispiel, die folgenden sind äquivalent:
Es kann auch verwendet werden, um Listen zu erzeugen (oder Bäume):
Bist du wahrscheinlich am besten dran, bekommen eine introductary Buch über lisp, wie Practical Common Lisp (die verfügbar ist zu Lesen, on-line).
InformationsquelleAutor der Antwort Kyle Burton
Wenn wir wollen, übergeben Sie ein argument, sich statt der übergabe den Wert der Argumentation, die wir verwenden, zitieren. Es ist vor allem im Zusammenhang mit der Prozedur übergeben, die während der Verwendung von Listen, Paare und Atome
die sind nicht verfügbar in der Programmiersprache C ( die meisten Menschen beginnen die Programmierung mit C Programmieren, Daher erhalten wir verwirrt)
Dies ist der code von Scheme-Programmiersprache ist ein Dialekt von lisp, und ich denke, Sie können verstehen Sie diesen code.
Die Letzte Zeile (atom? 'abc) ist vorbei abc, wie es um die Verfahren zu überprüfen, ob abc ist ein atom, oder nicht, aber wenn Sie passieren(atom? abc), dann prüft es, für den Wert abc und passses den Wert zu. Da wir noch keinen es
InformationsquelleAutor der Antwort vardin
In Emacs Lisp:
Was kann zitiert werden ?
Listen und Symbole.
Angabe einer Zahl ergibt die Zahl selbst:
'5
ist das gleiche wie5
.Was passiert, wenn Sie zitieren, Listen ?
Beispiel:
'(one two)
ausgewertet(list 'one 'two)
die Auswertung zu(list (intern "one") (intern ("two")))
.(intern "one")
erstellt ein symbol namens "one" und speichert es in einem "zentralen" hash-map, also immer wenn Sie sagen'one
dann das symbol mit der Bezeichnung"one"
gesucht, dass zentral-hash-map.Aber was ist ein symbol ?
Z.B. in OO-Sprachen (Java/Javascript/Python) ein symbol dargestellt werden können, als ein Objekt, das eine
name
Feld, das ist das symbol Namen wie"one"
oben, und Daten und/oder code kann im Zusammenhang mit diesem Objekt.So ein symbol in Python umgesetzt werden könnten:
In Emacs-Lisp zum Beispiel ein symbol kann 1) Daten, die im Zusammenhang mit it UND (zur gleichen Zeit für das gleiche symbol) 2) code zugeordnet - je nach Kontext, entweder die Daten oder der code aufgerufen wird.
Beispielsweise in Elisp:
ausgewertet
4
.Weil
(add add add)
bewertet als:So, zum Beispiel, indem die
Symbol
Klasse haben wir definiert in Python vor, dieseadd
ELisp-Symbol sein könnte, das in Python geschrieben wieSymbol("add",(lambda x,y: x+y),2)
.Vielen Dank für die Leute im IRC Channel #emacs für die Erklärung der Symbole und Zitate zu mir.
InformationsquelleAutor der Antwort jhegedus
Zitat liefert die interne Darstellung seiner Argumente. Nach dem Pflügen durch zu viele Erklärungen, was Zitat nicht tun, das ist, wenn die Glühbirne ging weiter. Wenn der REPL hat nicht convert-Funktion Namen in Großbuchstaben, wenn ich zitiert, Sie könnte es nicht haben, dämmerte mir.
So. Normale Lisp-Funktionen, die konvertiert Ihre Argumente in eine interne Darstellung, bewerten der Argumente und die Funktion anwenden. Zitat wandelt die Argumente in eine interne Repräsentation, und nur die Renditen, die. Technisch ist es richtig zu sagen, das Zitat sagt, "nicht zu beurteilen", aber wenn ich versuche zu verstehen, was es getan hat, sagt mir, was es nicht frustrierend war. Mein toaster nicht bewerten Lisp-Funktionen, entweder; aber das ist nicht, wie Sie erklären, was ein toaster tut.
InformationsquelleAutor der Antwort Steve
Anoter kurze Antwort:
quote
bedeutet, ohne zu bewerten, und backquote ist Zitat aber lassen hinteren Türen.Eine gute Referenz:
Emacs Lisp Reference Manual machen es sehr klar
9.3 Zitieren
Durch die Besondere form zitieren, gibt Ihr einziges argument, wie geschrieben, ohne zu bewerten. Dies bietet eine Methode zum einschließen von Konstanten, Symbole und Listen, die nicht selbst bewerten Objekte in einem Programm. (Es ist nicht notwendig zu zitieren, selbst-Auswertung von Objekten wie zahlen, strings und Vektoren.)
Besondere Form: zitieren Objekt
Weil Zitat wird so oft verwendet in Programmen, Lisp bietet eine bequeme Lesen syntax. Ein Apostroph ("') gefolgt von einem Lisp-Objekt (in der read-syntax) erweitert, um eine Liste, deren erstes element ist Zitat, und deren zweites element ist das Objekt. So, die Lesen syntax 'x ist eine Abkürzung für (quote x).
Hier sind einige Beispiele von Ausdrücken, verwenden Zitat:
9.4 Backquote
Backquote-Konstrukte erlauben, Sie zu zitieren, eine Liste, aber selektiv auswerten Elemente der Liste. Im einfachsten Fall ist es identisch mit der speziellen form zitieren (im vorherigen Abschnitt beschrieben; siehe Zitieren). Zum Beispiel diese zwei Formen Ausbeute identische Ergebnisse:
Die spezielle Markierung ',' im argument backquote zeigt einen Wert, der nicht konstant ist. Die Emacs-Lisp-evaluator wertet das argument,',', und setzt den Wert in die Struktur der Liste:
Substitution mit ',' ist erlaubt, sich auf tieferen Ebenen der Verzeichnis-Struktur auch. Zum Beispiel:
Können Sie auch splice-einer bewerteten Wert in der resultierenden Liste, mit den speziellen marker ',@'. Die Elemente der spliced-Liste werden Elemente auf der gleichen Ebene wie die anderen Elemente der resultierenden Liste. Der entsprechende code ohne"", ist oft nicht lesbar. Hier sind einige Beispiele:
InformationsquelleAutor der Antwort Andrew_1510