Gli spazi bianchi negli identificatori sono mai stati idiomatici? [chiuso]


43

Lo stile C # suggerisce di usare CamelCase negli identificatori per delimitare le parole. La tradizione Lisp suggerisce invece di usare trattini.

È mai esistito un linguaggio di programmazione in cui l'uso degli spazi negli identificatori non era solo consentito, ma un linguaggio comunemente usato quando si impiegano identificatori a più parole?

È possibile avere identificatori con spazi in alcune implementazioni di Scheme , ma non è una pratica ampiamente diffusa. Ecco un esempio:

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)

Se hai spazi dei nomi, questa è una forma di identificativo composto. Ad esempio C ++: bobs_utilities :: string_functions :: scramble. Questo è un nome e possiamo includere spazi bianchi arbitrari se vogliamo perché è sintassi, non un semplice token. I nomi con più componenti vogliono essere sintassi astratta; Le informazioni sullo spazio dei nomi in un singolo identificatore sono fondamentalmente un hack "manomissione del nome" per rappresentare la struttura all'interno del testo in cui manca il meccanismo per rappresentare la struttura.
Kaz,

Abbastanza comune in JS, il cui autore principale era un ragazzo dello Scheme.
Erik Reppen,

1
@ErikReppen Per quanto ne so, gli spazi non sono validi come parte degli identificatori javascript ...
Izkata

Non per vari no. Per i nomi delle proprietà possiamo usare qualsiasi stringa tra parentesi. ad es. alert({'some Prop':'bob'}['some Prop']);ma se quei nomi di proprietà di stringa non superano il test identificatore / etichetta non è possibile utilizzarli con la notazione punto.
Erik Reppen,

In Ruby puoi: define_singleton_method "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~" do; puts 42; end;e poi puoi: send "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~"ma non è comune.
Darek Nędza,

Risposte:


66

I compilatori FORTRAN hanno ignorato gli spazi così:

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

Erano identici per quanto riguarda il compilatore.

Alcuni dialetti SQL consentono spazi incorporati nei nomi delle colonne ma devono essere circondati da backquotes o da qualche altro delimitatore prima di poter essere utilizzati.


7
+1, questo è nuovo per me. Mi sono sempre chiesto perché avevo solo una B a Fortran ma ora lo so :)
NoChance

20
Il manuale FORTRAN di Sun includeva questa frase: "La separazione coerente delle parole dagli spazi divenne un'usanza generale intorno al X secolo d.C. e durò fino al 1957 circa, quando FORTRAN abbandonò la pratica".
Blrfl,

26

Visual Basic (e VBScript) consentono inoltre spazi bianchi negli identificatori se si circonda l'identificatore con parentesi quadre.

Dim [Hello World]
[Hello World] = 123

Tuttavia, farlo è piuttosto raro.


13

Conta SQL?

create table "Registered Members" (
    "Full Name" varchar(100),
    "Mailing Address" varchar(100),
    etc...
);

3
È certamente possibile, ma non lo definirei idiomatico.
Joachim Sauer,

3
Se hai bisogno di essere mascherato, non sembra essere incoraggiato.
utente sconosciuto

11

Beh, Whitespace è tutto su ... whitespace:

La maggior parte dei linguaggi di programmazione moderni non considera la sintassi dei caratteri degli spazi bianchi (spazi, tabulazioni e nuove righe), ignorandoli, come se non fossero presenti. Riteniamo che questa sia un'ingiustizia grave per questi membri perfettamente amichevoli del set di caratteri. Dovrebbero essere ignorati, solo perché sono invisibili? Lo spazio bianco è un linguaggio che cerca di ristabilire l'equilibrio. Qualsiasi carattere non bianco viene ignorato; solo gli spazi, le schede e le nuove righe sono considerati sintassi.

Sfortunatamente Markdown non supporta la sua sintassi e non posso mostrarti un po 'di codice, ma Wikipedia ha un esempio di codice amico dell'uomo .


@ sepp2k Whitespace ha etichette.
yannis,

Oh, hai ragione. Allora non importa.
sepp2k,

"La maggior parte dei linguaggi di programmazione moderni non considera i caratteri degli spazi bianchi". Python lo fa :)
jadkik94,

@ jadkik94 Python utilizza gli spazi bianchi, ma per il rientro non come identificatori.
yannis,

@YannisRizos Oh, sì. Ed è anche vero che la maggior parte delle lingue non usa affatto gli spazi bianchi (identificatori o no)
jadkik94

11

In Algol 68 potresti avere spazio negli identificatori (non ricordo se fossero significativi o meno). Ma le parole chiave sono state contrassegnate da carezze . L'uso dei nomi con lo spazio era idiomatico (almeno intorno a me).

VHDL permette di identificatori con spazi significativi nel loro sfuggito: \foo bar\. Questo permette anche di utilizzare parole chiave come identificativo \and\, qualsiasi carattere \n<42>\e caso sensibilità identificatori ( \Foo\e \foo\sono diverse, mentre Fooe foosono equivalenti, e diverso da entrambi \Foo\e\foo\!). Verilog ha anche identificato gli identificatori con la maggior parte di queste caratteristiche (gli identificatori normali fanno distinzione tra maiuscole e minuscole e la loro fuga inutilmente non crea un altro identificatore), ma non consente spazi in essi. La necessità di identificatori sfuggiti in VHDL e Verilog deriva dal fatto che sono spesso prodotti automaticamente da altre fonti (come lo schema) in cui gli identificatori di solito non hanno le stesse restrizioni del linguaggio di programmazione; AFAIK, non sono usati idiomaticamente in altre circostanze.


Mi sembra di ricordare che il corallo ha fatto qualcosa di simile (guardando indietro al 1980 qui!) - si poteva (e fatto) hanno uno spazio bianco in nomi di variabili, ma le parole chiave poi avuto le virgolette intorno a loro (come 'DEFINE'e, un favorito personale, 'COMMENT'Abbiamo usato. utilizzare il processore macro per sostituirli con versioni non quotate).
AAT

10

Non so se consideri MediaWiki wikitext una lingua, ma i nomi con spazi sono decisamente idiomatici:

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

Dove "espandi sezione" è il nome di un modello (http://en.wikipedia.org/wiki/Template:Expand_section)

Immagino che soddisfi i criteri: un linguaggio in cui gli identificatori contengono abitualmente spazi. Non è mai (penso?) Ambiguo perché gli identificatori sono sempre circondati da un sacco di punteggiatura per separarli dal testo wiki grezzo.


2
Mentre wikitext è certamente un linguaggio formale, non lo definirei un linguaggio di programmazione (non ha nemmeno loop).
svick,

@svick: Nemmeno Haskell, Smalltalk, Scheme, Clojure, Erlang, Lambda Calculus, Turing Machines, Io, Ioke, Seph, ...
Jörg W Mittag

@ JörgWMittag, ma hanno una ricorsione, che è solo un modo diverso di esprimere i loop. Wikitext non ha nemmeno quello.
svick

@svick A seconda delle estensioni installate, si ottengono alcune strutture di controllo nel markup di mediawiki. In particolare ottieni ifs e ricorsione. La sintassi e le prestazioni sono piuttosto male però. I modelli si comportano più o meno come funzioni e i loro nomi contano come identificatori nel mio libro.
CodesInChaos

1
Interessante, da [[Wikipedia: Transclusion]]: "Non esiste una vera funzionalità di loop integrata nel software Mediawiki a partire da questo momento ... ma ci sono alcuni trucchi per imitarli. Ad esempio, chiamare ripetutamente un modello che chiama ripetutamente un diversi template possono imitare un doppio loop. I template possono anche essere costretti a chiamarsi (normalmente vietato dal software Mediawiki oltre una singola istanza, per prevenire loop infiniti), mediante l'uso abile di reindirizzamenti (vedi m: Template: Loop1 (backlink, modifica)) Vedi anche m: Aiuto: conversione ricorsiva di wikitext. "
Steve Bennett,

9

Inform 7 è un sistema per lo sviluppo di narrativa interattiva che utilizza una sintassi simile al linguaggio naturale, in cui gli identificatori di più parole sono all'ordine del giorno:

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

La limitazione, ovviamente, è che un identificatore non può contenere una parola chiave quando questo sarebbe ambiguo.

Allo stesso modo, gli identificatori con caratteri di sottolineatura in Agda possono essere usati mixfix, il cui esempio più semplice è probabilmente l' if_then_else_operatore:

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

6

Scala consente identificatori arbitrari utilizzando i backtick. Il solito uso per questo è invocare Thread.`yield`perché yieldè una parola riservata in Scala. Questo potrebbe essere (ab) usato per avere spazi nei nomi, anche se sarebbe lontano dal codice Scala idiomatico:

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

Cavolo, puoi anche avere delle schede negli identificatori:

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

Suppongo che ciò possa essere plausibilmente idiomatico per il popolo letterato programmatore. Può essere.


Scala consente caratteri come +nei nomi dei metodi. Quindi obj.a+=1, lo analizzerebbe come se a+=fosse un metodo. L'inventore Martin Odersky nel suo libro di testo presume che i programmatori di solito includano spazi, quindi le ambiguità del parser non sono praticamente troppo problematiche.
Jesvin Jose,

1
@aitchnyu: In realtà, negli identificatori misti, la parte alfanumerica e la parte dell'operatore devono essere separate da un carattere di sottolineatura. obj.a+=1è equivalente a obj.a += 1cui è equivalente a obj.a.+=(1). Dovresti averlo obj.a_+=1se vuoi che funzioni come descrivi. (In realtà, ciò darà un errore di analisi, è necessario chiamare obj.a_+=(1)o obj a_+= 1.)
Jörg W Mittag

Questa non è una scheda ... è una stazione spaziale. E per stazione spaziale intendo una sequenza di escape di tabulazione.
Thomas Eding,


4

Potresti considerare questo come il caso in Cucumber / Gherkin , in cui i nomi delle funzioni sono effettivamente frasi con gli argomenti incorporati al loro interno.

Come estensione, mi aspetto che questo sia più comune nei piccoli DSL , dove il linguaggio dovrebbe essere amichevole per i non sviluppatori. Ad esempio, molti motori di regole forniscono un'abilità per definire regole con una descrizione di tipo inglese, in cui gli spazi possono essere utilizzati negli identificatori.


3

FWIW, Tcl consente spazi (e quasi ogni altro carattere) negli identificatori, anche se non è comune sfruttare questa funzionalità. Il motivo principale per cui non viene utilizzato molto spesso è solo che è necessario utilizzare una quotazione corretta. Ad esempio, quanto segue imposta una variabile denominata "il mio nome" su "bob", quindi la stampa

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

OTOH, è molto utile quando si creano variabili in modo dinamico poiché, quando si creano tali variabili, non ci si deve preoccupare di caratteri illegali



1

Se consideri un DSL di test automatizzato una lingua, il framework robot consente spazi nei nomi di parole chiave ed è molto idiomatico. Nel seguente esempio "Say hello" è un nome di parola chiave, "Esempio di test case" è un nome di test case e "$ {first name}" è una variabile:

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

*** Test Cases ***
| Example test case
| | Say hello | world

1

Il linguaggio 4D consente spazi bianchi nei nomi e nelle variabili dei metodi. È generalmente disapprovato all'interno della comunità, ma tutti i metodi e le variabili incorporati li usano quando applicabile ( SET MENU ITEM PARAMETERad esempio)


0

Smalltalk presenta metodi di parole chiave come quelli a:b:c:che coinvolgono spazi bianchi quando invocati. Ad esempio: a: 100 b: 200 c: 300. Questo è un linguaggio standard nella lingua.


0

Powershell consente spazi nei nomi delle variabili:

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

PS C:\> ${the var}
100

0

Ho visto parlare di simili per VB ma in JS questo è usato molto in realtà. È possibile accedere a qualsiasi proprietà di un oggetto in JavaScript e impostarla in forma di stringa con parentesi quadre o semplicemente come stringhe nei valori letterali degli oggetti. I nomi delle proprietà che non seguono le regole di denominazione delle variabili di JS sono inaccessibili tramite. notazione ma sono utili. Ad esempio, potresti voler mappare gli URL in base al comportamento o fare riferimento a un gruppo di persone per nome quando sei sicuro che siano tutti unici. Spesso è molto comodo e facile da leggere:

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

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

Ciò semplifica anche la ristrutturazione di JSON per facilitarne l'utilizzo senza perdere il fattore oggetto istantaneo quando viene inserito in JS.


Divertente che questa sia l'unica menzione di JavaScript. Sì, i metodi e le proprietà possono contenere stringhe: foo['my method']()efoo['my property']
Steve Bennett

0

Power Query utilizza molto codice generato automaticamente. Immagino che più della metà degli identificatori generati utilizzino spazi bianchi:

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"

Come puoi vedere, come in molte lingue c'è una sintassi extra per chiarire qual è l'identificatore.

Ma nei luoghi in cui è inequivocabile, non è necessaria alcuna sintassi aggiuntiva:

let
    spaceRecord = [with space = 42, recursive record = @spaceRecord],
    drilldown = spaceRecord[recursive record][recursive record][recursive record][with space]
in
    drilldown   // 42


-1

Il linguaggio di programmazione o42a che sto attualmente sviluppando supporta nomi di più parole . La lingua non ha parole chiave e i nomi sono generalmente separati da un simbolo. Nel raro caso i due nomi si susseguano, il carattere di sottolineatura viene utilizzato per separarli.



-4

Modifica: questa risposta ha dimostrato di non essere corretta, vedere i commenti.

Se capisco correttamente la tua domanda, un compilatore non può consentire spazi nel nome dell'identificatore perché potrebbe causare nomi duplicati (a meno che non venga utilizzato un delimitatore). Per esempio:

int my = 0; bool my count = false; int count = 0; if (il mio conte) ...

il termine "mio conteggio" confonde che potrebbe riferirsi alla variabile chiamata "il mio conteggio" o forse lo sviluppatore ha dimenticato di scrivere un operatore di relazione come> tra mio e conteggio.

COBOL ha permesso ai nomi di divisione e ai nomi di sezione di essere separati dallo spazio, ma quelli non sono identificatori e variabili come nella tua domanda.


4
Bene, non è il compilatore, è la definizione del linguaggio. La maggior parte delle lingue non può consentire spazi bianchi negli identificatori perché creerebbero ambiguità.
Steve Bennett,

2
Il tuo ragionamento mi sembra incerto. Nel tuo esempio l'unica alternativa my Countall'essere un nome di variabile sarebbe il programmatore che ha fatto un refuso. Questa non è ambiguità. L'ambiguità sarebbe se ci fosse un altro modo valido per analizzare l'espressione. Con lo stesso ragionamento si potrebbe dire che consentire a(b+c)è ambiguo perché forse il programmatore ha dimenticato un >e intendeva davvero a > (b + c).
sepp2k,

1
Ma (in un linguaggio che consente spazi nei nomi delle variabili) non c'è nemmeno ambiguità in if (my count). Non stai dicendo che esiste un modo diverso e valido per analizzare quell'affermazione (il che significherebbe che è ambigua). Stai dicendo che se aggiungi il personaggio <, finisci con un'analisi diversa e valida. E sto dicendo che se aggiungi il personaggio <a a(b+c)te finisci anche con un'analisi diversa e valida.
sepp2k,

1
@SteveBennett Right. Qualsiasi linguaggio che consentisse spazi nei nomi delle variabili avrebbe dovuto vietarli nei nomi dei tipi o utilizzare una sintassi diversa per le dichiarazioni dei tipi (come dire var name of the variable : type of the variable) - o non avere affatto le dichiarazioni dei tipi.
sepp2k,

1
@ sepp2k, ora ho capito il tuo punto. Grazie per il tempo dedicato a chiarirlo. La mia risposta non è corretta
NoChance,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.