Was ist der Unterschied zwischen Wörtern und Symbolen?

7

Beim Definieren einer Syntaxtabelle für einen Hauptmodus kann ich sowohl Wortbestandteile als auch Symbolbestandteile definieren.

Wann sollte ich jeden verwenden? Sollte beispielsweise eine Programmiersprache, die Variablen im Fall einer Schlange schreibt foo_bar, _Teil eines Wortes oder Symbols sein?

Wilfred Hughes
quelle
1
Die c-modemit emacs gelieferte Standardeinstellung wird _als Symbolbestandteil verwendet, jedoch nicht als Wortbestandteil. Ich gehe davon aus, dass es dafür einen guten Grund gibt. Ganz zu schweigen von der Fülle an Navigationsbefehlen, die wie erwartet funktionieren. Prinzip der geringsten Überraschung und so weiter.
Vamsi

Antworten:

4

Wortbestandteile: 'w'

Wortteile in menschlichen Sprachen. Diese werden normalerweise in Variablen- und Befehlsnamen in Programmen verwendet. Alle Groß- und Kleinbuchstaben sowie die Ziffern sind typischerweise Wortbestandteile.

Symbolbestandteile: '_'

Zusätzliche Zeichen, die in Variablen- und Befehlsnamen zusammen mit Wortbestandteilen verwendet werden. Beispiele sind die Zeichen '$ & * + -_ <>' im Lisp-Modus, die Teil eines Symbolnamens sein können, obwohl sie nicht Teil englischer Wörter sind. In Standard C ist das einzige Zeichen, das kein Wortbestandteil ist und in Symbolen gültig ist, der Unterstrich "_".

Mit freundlicher Genehmigung von gnu.org

Wann sollte ich jeden verwenden? Sollte _ beispielsweise bei einer Programmiersprache, die Variablen in den Schlangenfall foo_bar schreibt, Teil eines Wortes oder Symbols sein?

Es kommt darauf an, was Sie erreichen wollen. Ich werde sagen, '_' sollte Teil des Wortes sein. Auf diese Weise wird foo_bar als ein Wort behandelt.

Bitte werfen Sie ein Auge auf diese Frage , es gibt eine interessante Antwort über den Superword-Modus und den Subword-Modus

Nsukami _
quelle
2
Da der C-Modus _als Symbolbestandteil behandelt wird , warum schlagen Sie vor, ihn als Wortbestandteil zu behandeln?
Wilfred Hughes
@ WilfredHughes Sorry, aber hier hat niemand über C-Mode gesprochen. Sicher, er sollte vorsichtig sein, an welchem ​​Modus gearbeitet wird. Und wie ich in meiner Antwort sagte, ist es nur für den Fall, dass er foo_bar als ein Wort behandeln möchte. Bitte überprüfen Sie diese Frage
Nsukami _
6
Bitte verwenden Sie keine Wortsyntax für Zeichen wie _, da dies die Unterscheidung zwischen Wörtern und Symbolen vollständig zunichte macht. Wenn Sie Ihre gerne M-f, M-bund Freunde von Identifikatoren zu bewegen und nicht durch Worte, dann eher als Änderung Syntaxtabelle ist der Hauptmodus Sie verwenden sollen superword-mode.
Stefan
5
Achten Sie beim Schreiben Ihres Hauptmodus nicht darauf, dass Symbole und Wörter dasselbe sind. Viele Leute benutzen die Unterscheidung, und Sie würden ihr Leben schwerer machen. Menschen, die die Unterscheidung nicht mögen, haben bereits die Möglichkeit dazu superword-mode.
Malabarba
3
@ WilfredHughes: In der Tat sollte die Definition von Wörtern so gut wie nie geändert werden.
Stefan
5

Diese Antwort adressiert Ihren Fragentitel: " Was ist der Unterschied zwischen Wörtern und Symbolen ". Es spricht nicht nur den Text Ihrer Frage an, bei der es um die Symbolsyntax geht, die von @Nsukami gut beantwortet wurde.

Es gibt zwei sehr unterschiedliche Bedeutungen des Wortsymbols in Emacs:

  1. Symbolsyntax , die aus Wortbestandteilen und Symbolbestandteilen besteht . Dies kann für jeden Modus gelten, insbesondere für jeden Programmiermodus / jede Programmiersprache. @ Nsukami hat diese Bedeutung recht gut beschrieben.

  2. Emacs-Lisp-Symbole . Dies ist keine Syntaxkategorie. Ein Symbol ist ein Lisp Lisp Einheit oder das Objekt, das bestimmte Eigenschaften aufweist: a Namen , eine plist (Eigenschaftenliste) und möglicherweise ein Wert und eine Funktionsdefinition.

    Standardmäßig sind die Wertezelle und die Funktionszelle leer, und die Liste ist die leere Liste ( nil). Lisp Funktionen symbol-name, symbol-value, symbol-functionund symbol-plistdie Komponenten zurück.

Beachten Sie übrigens, dass diese Dinge im Emacs-Handbuch nicht erwähnt werden. Sie werden nur im Elisp-Handbuch behandelt. Und was vielleicht noch wichtiger ist: Es gibt keinen Indexeintrag , der mit " Symbol " für die erste Bedeutung (Syntax) übereinstimmt . Alle Indexeinträge, die den Begriff " Symbol " enthalten, beziehen sich auf die zweite Bedeutung (Lisp-Symbol). Insbesondere gibt es keinen Eintrag, der sowohl " Symbol " als auch " Syntax " enthält. Ob es einen solchen Indexeintrag geben sollte, weiß ich (wahrscheinlich) nicht. Dies kann Ihnen jedoch eine Vorstellung davon geben, wie wichtig Symbole für Lisp als Lisp-Objekte sind .

Weitere Informationen finden Sie unter:

Drew
quelle
Vielen Dank für die Erklärung der 2 verschiedenen Bedeutungen des Wortsymbols.
Nsukami _
2

Dies wird im ELisp-Handbuch erläutert .

Emacs verwendet die Terminologie von Lisp. Was Lisp und Emacs ein Symbol nennen, nennen viele andere Programmiersprachen einen * Bezeichner. Das ist der Name einer Variablen, Funktion usw.

Ein Wort ist eine Folge von Buchstaben oder Ziffern ohne dazwischenliegende Interpunktion.

In den meisten Programmiersprachen ist _neben Buchstaben und Ziffern auch der Unterstrich in Bezeichnern zulässig. Einige Sprachen wie Lisp erlauben mehr. In Programmiersprachen haben Zeichen, wie _sie in Bezeichnern vorkommen können, die Klasse „Symbolbestandteil“ _. Buchstaben und Ziffern haben die Klasse "Wortbestandteil" w.

Befehle, die auf Wörter einwirken, behandeln eine Folge von Wortbestandteilen als Wort. Befehle, die auf Ausdrücke (z. B. forward-sexp) einwirken , werden von ganzen Bezeichnern gleichzeitig verschoben. Die Syntaxhervorhebung behandelt normalerweise alle Symbolbestandteile identisch.

Gilles 'SO - hör auf böse zu sein'
quelle