Einige historische Hinweise sind fällig.
Emacs Lisp leiht viele Dinge von Common Lisp aus, aber die Ähnlichkeit ist nur oberflächentief. Das Doppelpunktsymbol in Common Lisp ist ein Namespace-Qualifikationsmerkmal. Kanonische Symbolnamen bestehen aus zwei Teilen: dem Namen des Pakets und dem Namen des Symbols in diesem Paket. Dies ist beispielsweise cl-user:apropos
ein im Paket definiertes Symbol cl-user
. Es gibt auch ein spezielles Schlüsselwortpaket, das beim Start automatisch von Common Lisp importiert wird. Dieses Paket wird für die Kommunikation zwischen anderen Paketen verwendet (damit Pakete, die symbolische Informationen aneinander senden müssen, nicht darüber streiten, wer sie deklarieren muss). Wie Sie vielleicht erraten haben, werden Symbole in diesem Paket mit dem führenden Doppelpunkt geschrieben.
Emacs Lisp hat kein Konzept für Pakete, aber der Doppelpunkt ist insofern etwas Besonderes, als er den Leser anweist, den Ausdruck als selbstbewertendes Symbol zu interpretieren (dh es handelt sich um eine Variable, deren Wert diese Variable selbst ist). Es gibt mehrere solche integrierte Selbst-Auswertung Symbole: t
und nil
sind Beispiele , die ich über später schreiben werde.
Das Apostroph stammt ebenfalls aus Common Lisp, wo es sich um ein Standardlesemakro handelt (dh um einen Code, den der Lisp-Interpreter beim Einlesen der Programmquelle ausführt). Es wird wie folgt erweitert: 'x -> (quote x)
Dabei (quote ...)
handelt es sich um eine spezielle Form, die den Lisp-Interpreter daran hindert, den Inhalt des Ausdrucks im Inneren auszuwerten. Emacs Lisp verfügt über drei integrierte Lesermakros : '
, `
und #
, aber Sie können keine eigenen hinzufügen. Die ersten beiden werden erweitert auf (quote ...)
, die zweite ermöglicht jedoch eine spezielle Syntax zum Erstellen des nicht bewerteten Ausdrucks. #
wird zu (function ...)
form erweitert , wodurch der Interpreter angewiesen wird, dass der Wert im Funktionsnamespace nachgeschlagen werden muss.
Symbole in Emacs Lisp müssen einen bestimmten Wert haben (ähnlich wie Variablen in anderen Sprachen), da es sich sonst um einen Fehler handelt. Sie können die Bewertung jedoch mithilfe des Angebotsformulars verhindern.
Schließlich ist der Unterschied zwischen:
(search-forward "something" nil 'noerror)
und
(search-forward "something" nil :noerror)
Haben Sie im ersten Fall search-forward
mit einem Symbol ohne Wert aufgerufen , für das nur der Name bekannt ist, und im zweiten Fall haben Sie diese Funktion mit einem Symbol aufgerufen, dessen Wert dieses Symbol selbst ist. Es kommt also vor, dass es dieser Funktion egal ist, welche Sie verwenden.
Typen sind ein wichtiges Programmierwerkzeug für die automatische Überprüfung von Programmen. Das Emacs Lisp-Typsystem ähnelt Common Lisp darin, dass sein universeller Typ (geschrieben als t
) der Typ ist, von dem alle anderen Typen abgeleitet sind. Andererseits nil
ist der Typ, von dem kein Typ abgeleitet ist (das Komplement von t
). Dies unterscheidet sich von vielen gängigen Programmiersprachen, die möglicherweise kein universelles Konzept oder einen bestimmten booleschen Typ haben.
Leider hat Emacs Lisp diesen Teil leider nicht genau aus Common Lisp kopiert, und die type-of
Funktion liefert verwirrende Ergebnisse für t
und nil
.
Emacs Lisp:
(type-of t) ; symbol
Common Lisp
(type-of t) ; BOOLEAN
Die Common Lisp-Erweiterung von Emacs Lisp hat eine Funktion, cl-typep
die jedoch zum Verständnis der Beziehung beitragen kann. So zum Beispiel
(cl-typep 'noerror t) ; t
dh was auch immer es 'noerror
ist, ist vom Typ t
.
nil
von der angegebenen Funktion gleich behandelt werden, übergebe ich in meinem Code ein Symbol mit demselben Namen oder ähnlich dem in der Funktionsbeschreibung verwendeten Parameternamen und normalerweise in Großbuchstaben. Dies dient mir als Erinnerung, wenn ich den Code lese. ZB(search-forward "abc" nil 'NOERROR)
. Dies ist am hilfreichsten für optionale Argumente, die selten verwendet werden.