War das Leerzeichen in Bezeichnern jemals idiomatisch? [geschlossen]

43

Im C # -Stil wird die Verwendung von CamelCase in Bezeichnern zur Abgrenzung von Wörtern empfohlen. Lisp Tradition schlägt vor, stattdessen Striche zu verwenden.

Gab es jemals eine Programmiersprache, in der die Verwendung von Leerzeichen in Bezeichnern nicht nur zulässig war, sondern eine häufig verwendete Redewendung bei der Verwendung von Bezeichnern mit mehreren Wörtern?

In einigen Schema- Implementierungen können Bezeichner mit Leerzeichen verwendet werden , dies ist jedoch keine weit verbreitete Praxis. Hier ist ein Beispiel:

Petite Chez Scheme Version 8.4
Copyright (c) 1985-2011 Cadence Research Systems

> (define |hey there| 100)
> (define |x y z| 200)
> (list |hey there| |x y z|)
(100 200)
dharmatech
quelle
Wenn Sie Namespaces haben, ist dies eine Art zusammengesetzter Bezeichner. ZB C ++: bobs_utilities :: string_functions :: scramble. Dies ist ein Name, und wir können beliebige Leerzeichen einfügen, wenn wir möchten, da es sich um eine Syntax handelt, die kein einfaches Token ist. Namen mit mehreren Komponenten möchten eine abstrakte Syntax haben. shoehorning Namespace-Informationen in einem einzelnen Bezeichner sind im Grunde genommen ein "Name Mangling" -Hack zur Darstellung der Struktur innerhalb von Text, bei dem Ihnen der Mechanismus zur Darstellung der Struktur fehlt.
Kaz
Ziemlich häufig bei JS, deren Hauptautor ein Scheme-Typ war.
Erik Reppen
1
@ErikReppen Soweit ich weiß, sind Leerzeichen als Teil der JavaScript-
IDs
Nicht für Vars Nr. Für Eigenschaftsnamen können beliebige Zeichenfolgen in Klammern verwendet werden. Beispiel: alert({'some Prop':'bob'}['some Prop']);Wenn diese Namen von Zeichenfolgeneigenschaften den Bezeichner- / Etikettentest nicht bestehen, können Sie sie nicht mit Punktnotation verwenden.
Erik Reppen
In Ruby können Sie: define_singleton_method "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~" do; puts 42; end;und dann können Sie: send "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~"aber es ist nicht üblich.
Darek Nędza

Antworten:

66

FORTRAN-Compiler ignorierten Leerzeichen wie folgt:

   result = value * factor  
   r e s u l t = val ue * fac tor
   result=value*factor`

Waren für den Compiler identisch.

Einige SQL-Dialekte erlauben eingebettete Leerzeichen in Spaltennamen, müssen jedoch von Anführungszeichen oder anderen Trennzeichen umgeben sein, bevor sie verwendet werden können.

James Anderson
quelle
7
+1, das ist neu für mich. Ich habe mich immer gefragt, warum ich in Fortran nur ein B bekommen habe, aber jetzt weiß ich :)
NoChance
20
Das FORTRAN-Handbuch von Sun enthielt den folgenden Satz: "Das konsequente Trennen von Wörtern durch Leerzeichen wurde um das zehnte Jahrhundert n. Chr. Zu einem allgemeinen Brauch und dauerte bis etwa 1957, als FORTRAN die Praxis aufgab."
Blrfl
26

Visual Basic (und VBScript) erlauben auch Leerzeichen in Bezeichnern, wenn Sie den Bezeichner mit eckigen Klammern umgeben.

Dim [Hello World]
[Hello World] = 123

Dies ist jedoch ziemlich selten.

Eric Lippert
quelle
13

Zählt SQL?

create table "Registered Members" (
    "Full Name" varchar(100),
    "Mailing Address" varchar(100),
    etc...
);
Barry Brown
quelle
3
Es ist sicherlich möglich, aber ich würde es nicht als idiomatisch bezeichnen.
Joachim Sauer
3
Wenn Sie eine Maskierung benötigen, wird diese anscheinend nicht empfohlen.
Benutzer unbekannt
11

Nun, bei Whitespace dreht sich alles um ... Whitespace:

In den meisten modernen Programmiersprachen wird die Leerzeichensyntax (Leerzeichen, Tabulatoren und Zeilenumbrüche) nicht berücksichtigt und ignoriert, als ob sie nicht vorhanden wären. Wir betrachten dies als grobe Ungerechtigkeit gegenüber diesen vollkommen freundlichen Mitgliedern des Zeichensatzes. Sollten sie ignoriert werden, nur weil sie unsichtbar sind? Whitespace ist eine Sprache, die versucht, das Gleichgewicht wieder herzustellen. Alle Nicht-Leerzeichen werden ignoriert. Nur Leerzeichen, Tabulatoren und Zeilenumbrüche werden als Syntax betrachtet.

Leider unterstützt Markdown seine Syntax nicht und ich kann Ihnen keinen Code zeigen, aber Wikipedia hat ein menschenfreundliches Codebeispiel .

yannis
quelle
@ sepp2k Whitespace hat Labels.
Yannis
Oh, du hast Recht. Egal Dann.
sepp2k
"Die meisten modernen Programmiersprachen berücksichtigen keine Leerzeichen". Python tut :)
jadkik94
@ jadkik94 Python verwendet Leerzeichen, aber zum Einrücken nicht als Bezeichner.
Yannis
@YannisRizos Oh ja. Und es ist auch wahr, dass die meisten Sprachen überhaupt kein Leerzeichen verwenden (Bezeichner oder nicht)
jadkik94
11

In Algol 68 könnte in Bezeichnern Platz sein (ich erinnere mich nicht, ob sie signifikant waren oder nicht). Die Keywords wurden jedoch durch Stoppen gekennzeichnet . Namen mit Leerzeichen zu verwenden war idiomatisch (zumindest um mich herum).

VHDL erlaubt Kennungen mit bedeutenden Räume in ihnen entronnen \foo bar\. Dies ermöglicht auch die Verwendung der Schlüsselwörter als Identifikator \and\, einem beliebigen Zeichen \n<42>\und die Groß- und Kleinschreibung in Identifikatoren ( \Foo\und \foo\unterschiedlich sind , während Foound fooäquivalent sind, und die sich von beiden \Foo\und\foo\!). Verilog hat auch Bezeichner mit den meisten dieser Merkmale angegeben (bei normalen Bezeichnern wird die Groß- und Kleinschreibung beachtet, und wenn sie unnötigerweise maskiert werden, wird kein weiterer Bezeichner erstellt), in ihnen sind jedoch keine Leerzeichen zulässig. Die Notwendigkeit von Escape-Kennungen in VHDL und Verilog ergibt sich aus der Tatsache, dass sie häufig automatisch aus anderen Quellen (wie z. B. Schaltplänen) erstellt werden, bei denen Kennungen normalerweise nicht die gleiche Einschränkung aufweisen wie in der Programmiersprache. AFAIK, unter anderen Umständen werden sie nicht idiomatisch verwendet.

Ein Programmierer
quelle
Ich scheine mich zu erinnern (mit Blick auf die 1980er Jahre hier!), Dass CORAL etwas Ähnliches getan hat - Sie konnten (und hatten) Leerzeichen in Variablennamen, aber Schlüsselwörter hatten dann Anführungszeichen (wie 'DEFINE'und, ein persönlicher Favorit, den 'COMMENT'wir verwendet haben) den Makroprozessor verwenden, um diese durch nicht zitierte Versionen zu ersetzen).
AAT
10

Ich weiß nicht, ob Sie MediaWiki Wikitext als Sprache betrachten, aber Namen mit Leerzeichen sind definitiv idiomatisch:

==Example==
This example lacks text.
{{Expand section}}

Wobei "expand section" der Name einer Vorlage ist (http://en.wikipedia.org/wiki/Template:Expand_section)

Ich denke, es erfüllt die Kriterien - eine Sprache, in der Bezeichner routinemäßig Leerzeichen enthalten. Es ist nie (glaube ich?) Mehrdeutig, weil Bezeichner immer von vielen Satzzeichen umgeben sind, um sie von rohem Wiki-Text zu trennen.

Steve Bennett
quelle
2
Obwohl Wikitext sicherlich eine formale Sprache ist, würde ich es nicht als Programmiersprache bezeichnen (es hat nicht einmal Schleifen).
Svick
@svick: Haskell, Smalltalk, Schema, Clojure, Erlang, Lambda-Kalkül, Turing Machines, Io, Ioke, Seph,…
Jörg W Mittag
@ JörgWMittag, aber sie haben Rekursion, was nur eine andere Art ist, Schleifen auszudrücken. Wikitext hat das nicht einmal.
Svick
@svick Abhängig davon, welche Erweiterungen Sie installiert haben, erhalten Sie einige Kontrollstrukturen im MediaWiki-Markup. Insbesondere erhalten Sie ifs und Rekursion. Syntax und Leistung sind allerdings ziemlich schlecht. Vorlagen verhalten sich ziemlich ähnlich wie Funktionen, und ihre Namen gelten in meinem Buch als Bezeichner.
CodesInChaos
1
Interessant aus [[Wikipedia: Transclusion]]: "Derzeit ist keine echte Loop-Funktionalität in die Mediawiki-Software integriert ... aber es gibt einige Tricks, um sie nachzuahmen. Zum Beispiel das wiederholte Aufrufen einer Vorlage, die wiederholt a aufruft Unterschiedliche Vorlagen können eine Doppelschleife imitieren. Vorlagen können auch dazu gezwungen werden, sich selbst aufzurufen (normalerweise von der Mediawiki-Software nach einer einzelnen Instanz verboten, um Endlosschleifen zu verhindern), indem Umleitungen geschickt verwendet werden (siehe m: Vorlage: Schleife1 (Backlinks, edit)) Siehe auch m: Help: Rekursive Konvertierung von Wikitext. "
Steve Bennett
9

Inform 7 ist ein System zur Entwicklung interaktiver Belletristik in natürlicher Syntax, in der Kennungen mit mehreren Wörtern an der Tagesordnung sind:

Mr Jones wears a top hat. The crate contains a croquet mallet. 

Die Einschränkung besteht natürlich darin, dass ein Bezeichner kein Schlüsselwort enthalten darf, wenn dies nicht eindeutig wäre.

In ähnlicher Weise können Bezeichner mit Unterstrichen in Agda mixfix verwendet werden. Das einfachste Beispiel hierfür ist wahrscheinlich der if_then_else_Operator:

if_then_else_ : {A : Set} -> Bool -> A -> A -> A
if true  then x else y = x
if false then x else y = y
Jon Purdy
quelle
6

Scala erlaubt beliebige Bezeichner mit Backticks. Die übliche Verwendung hierfür ist das Aufrufen, Thread.`yield`da yieldes sich bei Scala um ein reserviertes Wort handelt. Dies könnte (ab) verwendet werden, um Leerzeichen in Namen zu haben, obwohl das alles andere als idiomatischer Scala-Code wäre:

val `the answer` = 42
println(`the answer`)

Sie können sogar Tabulatoren in Bezeichnern haben:

scala> val `the\tanswer` = 42
the     answer: Int = 42

Ich nehme an, dies könnte möglicherweise für das Literarische Programmierung Volk seines idiomatischen. Vielleicht.

Peter C
quelle
Scala erlaubt Zeichen wie +in Methodennamen. Also obj.a+=1würde es es analysieren, als ob a+=es eine Methode wäre. Der Erfinder Martin Odersky geht in seinem Lehrbuch davon aus, dass Programmierer üblicherweise Leerzeichen einschließen, so dass Parser-Ambiguitäten praktisch nicht zu problematisch sind.
Jesvin Jose
1
@aitchnyu: In gemischten Bezeichnern müssen der alphanumerische Teil und der Operator-Teil durch einen Unterstrich getrennt werden. obj.a+=1ist äquivalent zu obj.a += 1dem äquivalent zu obj.a.+=(1). Das müssten Sie haben, obj.a_+=1wenn Sie möchten, dass es so funktioniert, wie Sie es beschreiben. (Tatsächlich wird das einen Analysefehler geben, Sie müssen entweder anrufen obj.a_+=(1)oder obj a_+= 1.)
Jörg W Mittag
Das ist kein Tab… es ist eine Raumstation. Und mit Raumstation meine ich eine Tab-Escape-Sequenz.
Thomas Eding
4

Möglicherweise ist dies in Cucumber / Gherkin der Fall , wo Funktionsnamen effektiv Sätze mit den darin eingebetteten Argumenten sind.

Als Erweiterung würde ich erwarten, dass dies häufiger bei winzigen DSLs vorkommt , bei denen die Sprache für Nicht-Entwickler geeignet sein soll. Beispielsweise bieten viele Regel-Engines die Möglichkeit, Regeln mit einer englischen Beschreibung zu definieren, bei der Leerzeichen in Bezeichnern verwendet werden können.

Chris Pitman
quelle
3

FWIW, Tcl erlaubt Leerzeichen (und fast jedes andere Zeichen) in Bezeichnern, obwohl es nicht üblich ist, diese Funktion zu nutzen. Der Hauptgrund, warum es nicht sehr oft verwendet wird, ist nur, dass Sie korrekte Anführungszeichen verwenden müssen. Im Folgenden wird beispielsweise eine Variable mit dem Namen "Mein Name" auf "Bob" gesetzt und dann gedruckt

set "my name" "bob"
puts "hello, ${my name}"

OTOH, es ist sehr nützlich, wenn Variablen dynamisch erstellt werden, da man sich beim Erstellen solcher Variablen keine Gedanken über unzulässige Zeichen machen muss

Bryan Oakley
quelle
1

Wenn Sie einen automatisierten DSL-Test für eine Sprache halten, lässt das Roboter-Framework Leerzeichen in Keyword-Namen zu und ist sehr idiomatisch. Im folgenden Beispiel ist "Say hello" ein Schlüsselwortname, "Example test case" ein Testfallname und "$ {first name}" eine Variable:

*** Keywords ***
| Say hello | [Arguments] | ${first name}
| | log | Hello, ${first name}

*** Test Cases ***
| Example test case
| | Say hello | world
Bryan Oakley
quelle
1

Die 4D Sprache erlaubt Leerzeichen in Methodennamen und Variablen. Es ist in der Regel in der Community verpönt, wird jedoch von allen integrierten Methoden und Variablen verwendet, sofern zutreffend ( SET MENU ITEM PARAMETERz. B.).

3Doubloons
quelle
0

Smalltalk enthält Schlüsselwortmethoden, a:b:c:die beim Aufrufen Leerzeichen enthalten. Zum Beispiel: a: 100 b: 200 c: 300. Dies ist eine Standardsprache in der Sprache.

Dharmatech
quelle
0

Powershell erlaubt Leerzeichen in Variablennamen:

PS C:\> ${the var} = 100

PS C:\> ${the var}
100
Dharmatech
quelle
0

Ich habe gesehen, dass für VB etwas Ähnliches erwähnt wurde, aber in JS wird dies tatsächlich häufig verwendet. Auf jede Eigenschaft eines Objekts in JavaScript kann zugegriffen werden und sie kann in Form von Zeichenfolgen in eckigen Klammern oder einfach als Zeichenfolgen in Objektliteralen festgelegt werden. Auf Eigenschaftsnamen, die nicht den Regeln für die variable Benennung von JS entsprechen, kann über nicht zugegriffen werden. Notation, aber sie sind praktisch. Beispielsweise möchten Sie möglicherweise URLs dem Verhalten zuordnen oder eine Gruppe von Personen anhand ihres Namens referenzieren, wenn Sie sicher sind, dass sie alle eindeutig sind. Es ist oft sehr praktisch und leicht zu lesen:

var peoplesFavoriteThings = {
    "Bob Jones":"kittens",
    "Jane Doe":"chainsaws"
}

for(var name in peoplesFavoriteThings){
    console.log(name + ' likes ' + peoplesFavoriteThings[name] + '.\n');
}

Dies macht es auch einfach, JSON zu restrukturieren, um die Verwendung zu vereinfachen, ohne den Instant-Object-Faktor zu verlieren, wenn er in JS abgelegt wird.

Erik Reppen
quelle
Komisch, dass dies die einzige Erwähnung von JavaScript ist. Ja, Methoden und Eigenschaften können Zeichenfolgen enthalten: foo['my method']()undfoo['my property']
Steve Bennett
0

Power Query verwendet viele automatisch generierte Codes. Ich schätze, mehr als die Hälfte der generierten Bezeichner verwenden Leerzeichen:

let
    Source = Sql.Database(".", "Test"),
    dbo_pvt = Source{[Schema="dbo",Item="pvt"]}[Data],
    #"Filtered Rows" = Table.SelectRows(dbo_pvt, each [VendorID] <= 4),
    #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Emp1", "Emp2"}),
    #"Grouped Rows" = Table.Group(#"Removed Columns", {"Emp3", "Emp4"}, {{"Count", each List.Sum([Emp5]), type number}})
in
    #"Grouped Rows"

Wie Sie sehen, gibt es, wie in vielen Sprachen, eine zusätzliche Syntax, um zu unterscheiden, was der Bezeichner ist.

Aber an Stellen, an denen es eindeutig ist, ist keine zusätzliche Syntax erforderlich:

let
    spaceRecord = [with space = 42, recursive record = @spaceRecord],
    drilldown = spaceRecord[recursive record][recursive record][recursive record][with space]
in
    drilldown   // 42
Carl Walsh
quelle
-1

Die Programmiersprache o42a, die ich gerade entwickle, unterstützt Namen mit mehreren Wörtern . Die Sprache hat überhaupt keine Schlüsselwörter und die Namen werden normalerweise mit einem Symbol getrennt. In seltenen Fällen folgen die beiden Namen aufeinander, der Unterstrich dient zur Trennung.

lorus
quelle
-4

Bearbeiten: Diese Antwort hat sich als nicht korrekt erwiesen, siehe die Kommentare.

Wenn ich Ihre Frage richtig verstehe, kann ein Compiler keine Leerzeichen im Bezeichnernamen zulassen, da dies zu doppelten Namen führen kann (sofern kein Trennzeichen verwendet wird). Zum Beispiel:

int my = 0; bool my count = false; int count = 0; wenn (mein Graf) ...

Der Begriff 'my count' ist verwirrend. Er kann sich entweder auf die Variable 'my count' beziehen, oder der Entwickler hat vergessen, einen Beziehungsoperator wie> zwischen my und count zu schreiben.

Mit COBOL konnten Abteilungs- und Abschnittsnamen durch Leerzeichen getrennt werden, dies sind jedoch keine Bezeichner und Variablen wie in Ihrer Frage.

Emmad Kareem
quelle
4
Nun, es ist nicht der Compiler, es ist die Sprachdefinition. In den meisten Sprachen ist Leerzeichen in Bezeichnern nicht zulässig, da dies zu Mehrdeutigkeiten führen würde.
Steve Bennett
2
Ihre Argumentation scheint mir irgendwie zweifelhaft. In Ihrem Beispiel wäre die einzige Alternative zum my CountVariablennamen ein Tippfehler des Programmierers. Das ist keine Mehrdeutigkeit. Mehrdeutigkeit wäre, wenn es einen anderen gültigen Weg zum Parsen des Ausdrucks gäbe . Nach der gleichen Überlegung könnte man sagen, dass das Zulassen a(b+c)mehrdeutig ist, weil der Programmierer vielleicht ein vergessen >und wirklich gemeint hat a > (b + c).
sepp2k
1
Aber (in einer Sprache, die Leerzeichen in Variablennamen zulässt) gibt es auch keine Mehrdeutigkeit in if (my count). Sie sagen nicht, dass es einen anderen, gültigen Weg gibt, diese Aussage zu analysieren (was bedeuten würde, dass sie mehrdeutig ist). Sie sagen, wenn Sie den Charakter hinzufügen <, erhalten Sie eine andere, gültige Analyse. Und ich sage, wenn Sie den Charakter hinzufügen <, erhalten a(b+c)Sie auch eine andere, gültige Analyse.
sepp2k
1
@SteveBennett Richtig. Jede Sprache, die Leerzeichen in Variablennamen zulässt, müsste diese entweder in Typnamen nicht zulassen oder eine andere Syntax für Typdeklarationen verwenden (wie zum Beispiel var name of the variable : type of the variable) - oder überhaupt keine Typdeklarationen haben.
sepp2k
1
@ sepp2k, jetzt hab ich deinen Standpunkt verstanden. Vielen Dank, dass Sie sich die Zeit genommen haben, es klar zu machen. Meine Antwort ist falsch.
NoChance