Ich studiere Lisp jetzt. Ich traf 2 Begriffe "Liste" und "S-expression". Ich kann einfach nicht unterscheiden zwischen Ihnen. Sind Sie nur Synonyme in Lisp?
Ersten, nicht alle S-Ausdrücke, Listen repräsentieren; ein Ausdruck wie foobar werden, was einer bloßen atom, auch als ein S-Ausdruck. Wie ist der "cons-Zelle" - syntax (car . cons), verwendet, wenn die "Nachteile" - Teil nicht in der anderen Liste (oder null). Die mehr bekannte Liste Ausdruck, wie (a b c d) ist nur syntaktischer Zucker für eine Kette von verschachtelten cons-Zellen; das Beispiel erweitert um (a . (b . (c . (d . nil)))).
Zweite, den Begriff "S-expression" bezieht sich auf die syntax - (items like this (possibly nested)). So eine S-expression ist die Darstellung in Lisp source code von einer Liste, aber es ist technisch nicht eine Liste selbst. Diese Unterscheidung ist die gleiche wie zwischen einer Sequenz von decimal-Ziffern und deren numerischen Wert, oder zwischen einer Sequenz von Zeichen innerhalb von Anführungszeichen und den resultierenden string.
Das ist vielleicht eine allzu technischen Unterschied; der Programmierer routinemäßig beziehen sich auf wörtliche Darstellungen der Werte, als wären Sie die Werte selbst. Aber mit Lisp und Listen, die Dinge ein wenig schwieriger, da alles in ein Lisp-Programm ist technisch gesehen eine Liste.
Betrachten Sie zum Beispiel diesen Ausdruck:
(+ 1 2)
Oben ist eine einfache S-Ausdruck ist eine flache Liste bestehend aus den Atomen +, 1, und 2.
Jedoch innerhalb eines Lisp-Programm, dass eine solche Liste interpretiert werden als ein Aufruf an die + Funktion mit 1 und 2 als Argumente. (Bitte beachten Sie, dass die Liste, nicht die S-expression, die so interpretiert wird; das Auswertungsprogramm übergeben-Listen, die bereits vorab analysiert, die durch den Leser, nicht-source-code-text.)
Während also die oben genannten S-Ausdruck stellt eine Liste, es würde nur selten werden bezeichnet als "Liste" im Zusammenhang mit einem Lisp-Programm. Es sei denn, diskutieren, Makros, oder das Innenleben des Lesers, oder engagiert in einer metasyntactic Diskussion, weil einige andere code-Generierung oder Analyse von Kontext, eine typische Lisp-Programmierer würde statt behandeln, die von oben wie ein numerischer Ausdruck.
Auf der anderen Seite, eine der folgenden S-Ausdrücke, die wahrscheinlich würde bezeichnet werden als "Listen", da die Bewertung der als Lisp-code erzeugen würde, die Liste, vertreten durch die oben genannten literal-S-expression als runtime Wert:
'(+12)(quote(+12))(list '+12)
Selbstverständlich, die Gleichwertigkeit von code und Daten ist eine der coolen Dinge über Lisp, so dass die Unterscheidung ist fließend. Aber mein Punkt ist, dass, während alle der oben genannten sind S-Ausdrücke und Listen, die nur einige genannt werden würde, als "Listen" in casual-Lisp-sprechen.
Liste ist eine cons-Zelle-Kette mit sentinel NIL. dass' alle. die reader konvertiert text in S-Ausdrücke-alles ist S-Ausdruck in LISP-es ist entweder atom oder eine cons-Zelle (Vektoren sind Atome, etc.). der Leser macht keinen Versuch zu validieren, das argument für eval.
S-Ausdrücke sind nicht auf die Ausgabe durch den Leser. Eine "S-expression" bezieht sich auf die textliche Darstellung, mit den Klammern und so weiter. Durch die Zeit, der Leser ist mit Ihr geschehen, es ist nicht mehr eine S-expression, aber bereits eine aktuelle Liste im Speicher, der "cons-Zelle-Kette mit null-sentinel", die Sie erwähnt.
Historisch ein s-expression (kurz für symbolischen Ausdruck) wird beschrieben als:
Symbole wie FOO und BAR
cons-Zellen mit s-expressions als das erste und das zweite element : (Ausdruck-1.Ausdruck-2)
die Liste der Kündigung symbol NIL
und eine Konvention zu Listen schreiben: (A.(B.NIL)) ist einfacher geschrieben als die Liste (A B)
Beachten Sie auch, dass historisch-Programm text war anders geschrieben. Ein Beispiel für die Funktion ASSOC.
assoc[x;y] =eq[caar[y];x] -> cadar[y];
T -> assoc[x;cdr[y]]
Historisch gab es auch eine Zuordnung von diesen m-Ausdrücken (kurz für meta-Ausdrücke) von s-Ausdrücke. Heute sind die meisten Lisp-Programm-code geschrieben, mit s-expressions.
In die Lisp-Programmierung Sprachen wie Common Lisp heutzutage s-Ausdrücke mehr syntax und codieren kann weitere Datentypen:
Symbole: symbol123, |This is a symbol with spaces|
Zahlen: 123, 1.0, 1/3, ...
Saiten: "This is a string"
Zeichen: #\a, #\space
Vektoren: #(a b c)
Conses und Listen: ( a . b ), (a b c)
Kommentare: ; this is a comment, #| this is a comment |#
mehr.
Listen
Einer Liste ist eine Datenstruktur. Es besteht aus cons-Zellen und eine Liste end-marker. Listen in Lisp eine notation als Listen in s-Ausdrücke. Sie könnten einige andere Notationen für Listen, aber in Lisp hat man sich auf die s-expression-syntax zu schreiben.
Seite Hinweis: Programme und Formen
In einer Programmiersprache wie Common Lisp, die die Ausdrücke der Programmiersprache nicht den text, sondern Daten! Dies unterscheidet sich von vielen anderen Programmiersprachen. Ausdrücke in der Programmiersprache Common Lisp genannt Lisp forms.
Beispielsweise eine Funktion aufgerufen wird die Lisp-Daten, wo der Aufruf ist eine Liste mit einer Funktion symbol als erstes element und die nächsten Elemente sind die Argumente.
Können wir schreiben, dass als (sin 3.0). Aber es ist wirklich Daten. Die Daten können wir auch bauen.
Die Funktion zum auswerten von Lisp-Formen heißt EVAL und es dauert Lisp-Daten, nicht das Programm text-oder Saiten-Programm text. So können Sie konstruieren Programme mit Lisp-Funktionen, die Rückkehr Lisp-Daten: (EVAL (LIST 'SIN 3.0)) ausgewertet 0.14112.
Seit Lisp-Formen haben eine Darstellung der Daten, Sie sind in der Regel geschrieben, mit der externe Daten-Darstellung von Lisp - was ist was? - s-Ausdrücke!
Es ist s-Ausdrücke. Lisp-Formen als Lisp-Daten geschrieben werden extern als s-Ausdruck.
S-Ausdrücke, die zuerst kam. Sie waren nie dazu gedacht zu sein, was der Programmierer sah, sondern eher eine intermediate-Repräsentation. Es dauerte jedoch eine Weile, um zu kommen mit der top-level-Darstellung, M-Ausdrücke, und es hat nicht beeindrucken, das team. Alle hatten beschlossen, Sie mochte S-Ausdrücke ist. So, auch historisch gesehen, war es immer S-Ausdrücke, die alle der Weg nach unten; M-Ausdrücke sind eine Fußnote am besten.
Reed: McCarthy-Papier aus dem Jahr 1960 beschreibt sowohl symbolische Ausdrücke und meta-expressions.
So ist es nicht, @rainerjoswig. Ich glaube, ich täuschte sich. Danke für die Korrektur.
Sie sagte: "cons-Zellen mit expressions...", sollte es nicht "cons-Zellen mit s-expressions..."?
yep, irgendwie. Eigentlich ist das Papier spricht über die geordnete Paare...
Wenn man schreibt, "Ausdruck-1 . Ausdruck-2", hast du vielleicht tatsächlich bedeuten, .. s-Ausdruck-1 . s-expression-2 ?
Sollten Sie zuerst verstehen, main Lisp-Funktion - Programm manipuliert werden kann, als Daten. Im Gegensatz zu anderen Programmiersprachen (wie C oder Java), wo Sie schreiben, das Programm durch die Verwendung von speziellen syntax ( { , }, class, define usw.), in Lisp schreiben Sie code als (geschachtelte) Listen (btw, dies ermöglicht eine express - abstrakte syntaktische Bäume direkt). Noch einmal: Sie schreiben Programme, die genauso Aussehen wie Sprache, Daten-Strukturen.
Wenn Sie darüber sprechen, wie Daten, Sie nennen es "Liste", aber wenn Sie sprechen Sie über Programm-code, sollten Sie besser Begriff "s-expression". So, technisch sind Sie ähnlich, aber in verschiedenen Kontexten verwendet werden. Die einzige wirkliche Ort, wo diese Begriffe vermischt werden, ist meta-Programmierung (in der Regel mit Makros).
Beachten Sie auch, dass die s-expression als auch aus der nur atom (wie z.B. zahlen, strings, usw.).
s-Ausdruck ist historisch nicht Programm-code, sondern eine Daten-notation. Eine Liste ist eine Datenstruktur. Sehen McCarthys Originalarbeit über Lisp.
als Beispiel nehmen Sie einen Blick an mapcar definition von CLHS - es sagt "mapcar arbeitet auf aufeinanderfolgende Elemente des Liste". Listen, nicht s-Ausdrücke. Auf der anderen Seite, können Sie sehen selten die phrase "interpreter wertet diese Liste...", in den meisten Fällen werden Sie sehen, "interpreter wertet s-expressions...". Dies ist, wie Sie verwendet werden jetzt in Unterhaltungsliteratur. Obwohl (und ich betonte dies) diese Begriffe sind sehr ähnlich und so könnte stören während der langen Lisp-Geschichte, vor allem in wissenschaftlichen arbeiten.
sicher, mapcar Werke auf den Listen. Nein, eval funktioniert nicht auf s-Ausdrücke. Es funktioniert auf Lisp-Formen dargestellt, die als Daten.
sich nicht die nichts, durch definition, sind Sie Werte etwas, und sollte sich irgendwie vertreten. In-memory-Daten über Lisp Formen kann dargestellt werden als geschachtelte Lisp-Liste, andere Art der Liste (nicht in diesem Lisp selbst), Satz von Java-Klassen, Instanzen, Hierarchie von algebraischen Datentypen in Haskell oder nichts. In source-code (und von der Frage, es ist klar, dass OP war verwirrt über die Lisp-syntax) Lisp-Formen sind , die als text dargestellt formatiert (mit notation) s-expressions.
source-code in Lisp sind Lisp-Formen. Einige von jenen, die eine externe Darstellung als text, einige nicht. Zum Beispiel Verschlüsse, Bäche, clos-Objekte - Sie haben keine externe Repräsentation. Dennoch können Sie Teil von Lisp-Formen, als Daten.
Sie missverstehen Begriff "source code". Abgesehen von einigen sehr low-level und exotischen Programmiersprachen, Sie schreiben Programme durch die Eingabe von Zeichen in Ordnungszahl-text-Dateien. der Eingegebene text nennen wir source code. Und in Lisp dieser text hat die Schreibweise von s-Ausdrücke. Dieser text wird später umgewandelt in Lisp-Formen durch die Leser. Aber im text-Datei-es ist nur der text in einer notation, wie JSON oder XML.
Das ist, wo Lisp anders ist. Source code ist Daten.
werfen Sie einen Blick auf die definition von Quell-code in Wikipedia. In Lisp Programm ist vertreten in der gleichen Weise, wie die Daten, die er betreibt, auf die in source-code. Aber Sie können oder können nicht haben die gleiche Darstellung intern Speicher Lisp-code kann kompiliert werden und somit dargestellt werden als Satz von Prozessor-Anweisungen, während die Daten dargestellt, die als verknüpfte Listen oder andere Datenstrukturen. Sie ignorieren den Unterschied zwischen den source code (text), logisches Programmieren (was der Programmierer sieht) und Darstellung in Erinnerung, und daher auch ignorieren Zusammenhang Sie diese erstellen.
Common Lisp ANSI-Norm, Glossar-Eintrag für die source-code: "source code", n., code repräsentieren Objekte geeignet für evaluation (z.B. selbst erstellte Objekte Lesen, durch makro-expansion oder durch compiler-makro-expansion)." Quell-Datei: "Quelle Datei, n., eine Datei enthält eine textuelle Darstellung von source-code bearbeitet werden kann, geladen oder kompiliert ist."
dies ist spezifisch für Common Lisp, aber wenn Sie kümmern, ändern Sie jeden Eintrag in der "source code" auf "Quell-Datei" in meine Kommentare und Sie sollten Sie bekommen die Idee.
Das mitnehmen hier, terminologische nit-Kommissionierung beiseite, ist, dass die Lisp - eval - Funktion funktioniert nicht auf strings; in dieser unterscheidet es sich von der Funktion mit dem gleichen Namen in den meisten modernen dynamischen Sprachen. Stattdessen erwartet er in seiner Argumentation schon die in-memory-Repräsentation des Codes, die einen Baum von hierarchisch geschachtelten) Listen. Die reader - transformiert S-expressions in Listen ausgewertet werden. So, S-Ausdrücke: textuelle Repräsentation von Listen. Serialisiert, wirklich, viel die gleiche Weise wie JSON oder XML darstellen können, ist ein Objekt-Baum.
Beide sind geschrieben in ähnlicher Weise: (bla bla bla), kann verschachtelt werden. mit einem Unterschied - Listen mit vorangestelltem Apostroph.
Auswertung:
S-Ausdruck gibt einige Ergebnis (kann ein atom oder eine Liste oder null oder was auch immer)
Listen zurückgeben Listen
Wenn wir müssen, können wir konvertieren Listen an s-exp und Umgekehrt.
(eval '(blah blah blah)) => Liste wird behandelt, als eine s-exp und ein Ergebnis zurückgegeben.
(zitieren (bla bla bla)) => sexp umgewandelt Liste und die Liste wird zurückgegeben, ohne zu bewerten
IAS:
Wenn eine Liste wie Daten behandelt es heißt Liste, wenn es behandelt wird, als code, es heißt s-exp.
"Wenn eine Liste wie Daten behandelt es heißt Liste, wenn es behandelt wird, als code, es heißt s-exp." IME, wenn eine Liste wie Daten behandelt es heißt eine Liste, die es sonst nennt, was auch immer es ist - in der Regel einen Aufruf der Funktion. Der Begriff s-expression ist reserviert für die reden, speziell über die syntax in einer metatextual Weg.
Ersten, nicht alle S-Ausdrücke, Listen repräsentieren; ein Ausdruck wie
foobar
werden, was einer bloßen atom, auch als ein S-Ausdruck. Wie ist der "cons-Zelle" - syntax(car . cons)
, verwendet, wenn die "Nachteile" - Teil nicht in der anderen Liste (oder null). Die mehr bekannte Liste Ausdruck, wie(a b c d)
ist nur syntaktischer Zucker für eine Kette von verschachtelten cons-Zellen; das Beispiel erweitert um(a . (b . (c . (d . nil))))
.Zweite, den Begriff "S-expression" bezieht sich auf die syntax -
(items like this (possibly nested))
. So eine S-expression ist die Darstellung in Lisp source code von einer Liste, aber es ist technisch nicht eine Liste selbst. Diese Unterscheidung ist die gleiche wie zwischen einer Sequenz von decimal-Ziffern und deren numerischen Wert, oder zwischen einer Sequenz von Zeichen innerhalb von Anführungszeichen und den resultierenden string.Das ist vielleicht eine allzu technischen Unterschied; der Programmierer routinemäßig beziehen sich auf wörtliche Darstellungen der Werte, als wären Sie die Werte selbst. Aber mit Lisp und Listen, die Dinge ein wenig schwieriger, da alles in ein Lisp-Programm ist technisch gesehen eine Liste.
Betrachten Sie zum Beispiel diesen Ausdruck:
(+ 1 2)
Oben ist eine einfache S-Ausdruck ist eine flache Liste bestehend aus den Atomen
+
,1
, und2
.Jedoch innerhalb eines Lisp-Programm, dass eine solche Liste interpretiert werden als ein Aufruf an die
+
Funktion mit 1 und 2 als Argumente. (Bitte beachten Sie, dass die Liste, nicht die S-expression, die so interpretiert wird; das Auswertungsprogramm übergeben-Listen, die bereits vorab analysiert, die durch den Leser, nicht-source-code-text.)Während also die oben genannten S-Ausdruck stellt eine Liste, es würde nur selten werden bezeichnet als "Liste" im Zusammenhang mit einem Lisp-Programm. Es sei denn, diskutieren, Makros, oder das Innenleben des Lesers, oder engagiert in einer metasyntactic Diskussion, weil einige andere code-Generierung oder Analyse von Kontext, eine typische Lisp-Programmierer würde statt behandeln, die von oben wie ein numerischer Ausdruck.
Auf der anderen Seite, eine der folgenden S-Ausdrücke, die wahrscheinlich würde bezeichnet werden als "Listen", da die Bewertung der als Lisp-code erzeugen würde, die Liste, vertreten durch die oben genannten literal-S-expression als runtime Wert:
Selbstverständlich, die Gleichwertigkeit von code und Daten ist eine der coolen Dinge über Lisp, so dass die Unterscheidung ist fließend. Aber mein Punkt ist, dass, während alle der oben genannten sind S-Ausdrücke und Listen, die nur einige genannt werden würde, als "Listen" in casual-Lisp-sprechen.
eval
.S-Ausdrücke sind eine notation für Daten.
Historisch ein s-expression (kurz für symbolischen Ausdruck) wird beschrieben als:
FOO
undBAR
(
Ausdruck-1.
Ausdruck-2)
NIL
(
A
.
(
B
.
NIL
)
)
ist einfacher geschrieben als die Liste(A B)
Beachten Sie auch, dass historisch-Programm text war anders geschrieben. Ein Beispiel für die Funktion
ASSOC
.Historisch gab es auch eine Zuordnung von diesen m-Ausdrücken (kurz für meta-Ausdrücke) von s-Ausdrücke. Heute sind die meisten Lisp-Programm-code geschrieben, mit s-expressions.
Dies ist hier beschrieben: McCarthy, Rekursive Funktionen Symbolischer Ausdrücke
In die Lisp-Programmierung Sprachen wie Common Lisp heutzutage s-Ausdrücke mehr syntax und codieren kann weitere Datentypen:
symbol123
,|This is a symbol with spaces|
123
,1.0
,1/3
, ..."This is a string"
#\a
,#\space
#(a b c)
( a . b )
,(a b c)
; this is a comment
,#| this is a comment |#
mehr.
Listen
Einer Liste ist eine Datenstruktur. Es besteht aus cons-Zellen und eine Liste end-marker. Listen in Lisp eine notation als Listen in s-Ausdrücke. Sie könnten einige andere Notationen für Listen, aber in Lisp hat man sich auf die s-expression-syntax zu schreiben.
Seite Hinweis: Programme und Formen
In einer Programmiersprache wie Common Lisp, die die Ausdrücke der Programmiersprache nicht den text, sondern Daten! Dies unterscheidet sich von vielen anderen Programmiersprachen. Ausdrücke in der Programmiersprache Common Lisp genannt
Lisp forms
.Beispielsweise eine Funktion aufgerufen wird die Lisp-Daten, wo der Aufruf ist eine Liste mit einer Funktion symbol als erstes element und die nächsten Elemente sind die Argumente.
Können wir schreiben, dass als
(sin 3.0)
. Aber es ist wirklich Daten. Die Daten können wir auch bauen.Die Funktion zum auswerten von Lisp-Formen heißt
EVAL
und es dauert Lisp-Daten, nicht das Programm text-oder Saiten-Programm text. So können Sie konstruieren Programme mit Lisp-Funktionen, die Rückkehr Lisp-Daten:(EVAL (LIST 'SIN 3.0))
ausgewertet0.14112
.Seit Lisp-Formen haben eine Darstellung der Daten, Sie sind in der Regel geschrieben, mit der externe Daten-Darstellung von Lisp - was ist was? - s-Ausdrücke!
Es ist s-Ausdrücke. Lisp-Formen als Lisp-Daten geschrieben werden extern als s-Ausdruck.
Sollten Sie zuerst verstehen, main Lisp-Funktion - Programm manipuliert werden kann, als Daten. Im Gegensatz zu anderen Programmiersprachen (wie C oder Java), wo Sie schreiben, das Programm durch die Verwendung von speziellen syntax (
{
,}
,class
,define
usw.), in Lisp schreiben Sie code als (geschachtelte) Listen (btw, dies ermöglicht eine express - abstrakte syntaktische Bäume direkt). Noch einmal: Sie schreiben Programme, die genauso Aussehen wie Sprache, Daten-Strukturen.Wenn Sie darüber sprechen, wie Daten, Sie nennen es "Liste", aber wenn Sie sprechen Sie über Programm-code, sollten Sie besser Begriff "s-expression". So, technisch sind Sie ähnlich, aber in verschiedenen Kontexten verwendet werden. Die einzige wirkliche Ort, wo diese Begriffe vermischt werden, ist meta-Programmierung (in der Regel mit Makros).
Beachten Sie auch, dass die s-expression als auch aus der nur atom (wie z.B. zahlen, strings, usw.).
eval
- Funktion funktioniert nicht auf strings; in dieser unterscheidet es sich von der Funktion mit dem gleichen Namen in den meisten modernen dynamischen Sprachen. Stattdessen erwartet er in seiner Argumentation schon die in-memory-Repräsentation des Codes, die einen Baum von hierarchisch geschachtelten) Listen. Die reader - transformiert S-expressions in Listen ausgewertet werden. So, S-Ausdrücke: textuelle Repräsentation von Listen. Serialisiert, wirklich, viel die gleiche Weise wie JSON oder XML darstellen können, ist ein Objekt-Baum.Eine einfache definition für eine S-expression ist
Beide sind geschrieben in ähnlicher Weise: (bla bla bla), kann verschachtelt werden. mit einem Unterschied - Listen mit vorangestelltem Apostroph.
Auswertung:
Wenn wir müssen, können wir konvertieren Listen an s-exp und Umgekehrt.
IAS:
s-expression
ist reserviert für die reden, speziell über die syntax in einer metatextual Weg.