O espaço em branco nos identificadores já foi idiomático? [fechadas]

43

O estilo C # sugere o uso do CamelCase em identificadores para delimitar palavras. A tradição Lisp sugere usar traços.

Já existiu uma linguagem de programação em que o uso de espaços em identificadores não era apenas permitido, mas um idioma comumente usado ao empregar identificadores de várias palavras?

É possível ter identificadores com espaços em algumas implementações do Scheme , mas não é uma prática amplamente vista. Aqui está um exemplo:

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
fonte
Se você tiver espaços para nome, essa é uma forma de identificador composto. Por exemplo, C ++: bobs_utilities :: string_functions :: scramble. Este é um nome, e podemos incluir espaço em branco arbitrário, se quisermos, porque é uma sintaxe, não um token simples. Nomes com múltiplos componentes desejam ser sintaxe abstrata; As informações do namespace da calçadeira em um único identificador são basicamente um truque de "desconfiguração de nome" para representar a estrutura dentro do texto onde você não possui o mecanismo para representar a estrutura.
Kaz
Muito comum em JS, cujo principal autor era um cara do Scheme.
Erik Reppen
1
@ErikReppen Tanto quanto eu sei, espaços não são válidos como parte de identificadores javascript ...
Izkata
Não para vars não. Para nomes de propriedades, podemos usar qualquer string entre colchetes. por exemplo, alert({'some Prop':'bob'}['some Prop']);mas se esses nomes de propriedades de sequência falharem no teste de identificador / rótulo, você não poderá usá-los com notação de ponto.
precisa
No Ruby você pode: define_singleton_method "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~" do; puts 42; end;e então você pode: send "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~"mas não é comum.
Darek Nędza 04/04

Respostas:

66

Os compiladores FORTRAN ignoraram os espaços, portanto:

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

Foram idênticos no que diz respeito ao compilador.

Alguns dialetos SQL permitem espaços incorporados nos nomes das colunas, mas precisam estar entre aspas ou outro delimitador antes de poderem ser usados.

James Anderson
fonte
7
+1, isso é novo para mim. Eu sempre me perguntei por que eu só tenho um B em Fortran, mas agora eu sei :)
NoChance
20
O manual FORTRAN da Sun costumava incluir esta frase: "Separar consistentemente palavras por espaços tornou-se um costume geral por volta do século X dC, e durou até cerca de 1957, quando FORTRAN abandonou a prática".
Blrfl
26

O Visual Basic (e VBScript) também permitirá espaço em branco nos identificadores se você o envolver entre colchetes.

Dim [Hello World]
[Hello World] = 123

No entanto, fazer isso é bastante raro.

Eric Lippert
fonte
13

O SQL conta?

create table "Registered Members" (
    "Full Name" varchar(100),
    "Mailing Address" varchar(100),
    etc...
);
Barry Brown
fonte
3
Certamente é possível, mas eu não chamaria isso de idiomático.
Joachim Sauer
3
Se você precisar de mascaramento, isso não parece ser incentivado.
usuário desconhecido
11

Bem Whitespace é toda sobre ... o espaço em branco:

A maioria das linguagens de programação modernas não considera sintaxe de caracteres de espaço em branco (espaços, tabulações e novas linhas), ignorando-os, como se não estivessem lá. Consideramos que isso é uma injustiça grosseira para esses membros perfeitamente amigáveis ​​do conjunto de caracteres. Eles devem ser ignorados, apenas porque são invisíveis? Espaço em branco é uma linguagem que busca corrigir o equilíbrio. Quaisquer caracteres que não sejam espaços em branco são ignorados; apenas espaços, tabulações e novas linhas são consideradas sintaxe.

Infelizmente, o Markdown não suporta sua sintaxe e não posso mostrar algum código, mas a Wikipedia possui um exemplo de código amigável para humanos .

yannis
fonte
@ sepp2k O espaço em branco tem rótulos.
yannis
Oh, você está certo. Deixa pra lá então.
sepp2k
"A maioria das linguagens de programação modernas não considera caracteres de espaço em branco". O que é Python?
jadkik94
@ jadkik94 Python usa espaço em branco, mas para indentação não como identificadores.
precisa saber é
@YannisRizos Oh, sim. E também é verdade que a maioria das línguas não usar espaços em branco em todos os identificadores (ou não)
jadkik94
11

No Algol 68, você poderia ter espaço nos identificadores (não me lembro se eram significativos ou não). Mas as palavras-chave foram marcadas por stropping . Usar nomes com espaço neles era idiomático (pelo menos ao meu redor).

VHDL permite identificadores com espaços significativos na deles escapou: \foo bar\. Isso permite também usar palavras-chave como identificador \and\, qualquer caractere e distinção entre \n<42>\maiúsculas e minúsculas nos identificadores ( \Foo\e \foo\são diferentes enquanto Fooe foosão equivalentes e diferentes de \Foo\e\foo\!). A Verilog também possui identificadores espaçados com a maioria dessas características (identificadores normais diferenciam maiúsculas de minúsculas e escapá-los desnecessariamente não cria outro identificador), mas não permite espaços neles. A necessidade de identificadores de escape no VHDL e no Verilog vem do fato de que eles geralmente são produzidos automaticamente de outras fontes (como esquemas) onde os identificadores normalmente não têm a mesma restrição que na linguagem de programação; AFAIK, eles não são usados ​​idiomamente em outras circunstâncias.

AProgrammer
fonte
Eu me lembro (olhando para a década de 1980 aqui!) Que o CORAL fez algo semelhante - você pode (e teve) ter espaço em branco em nomes de variáveis, mas as palavras-chave tinham aspas (como 'DEFINE'e um favorito pessoal) 'COMMENT'. para usar o processador macro para substituí-los por versões não citadas).
AAT
10

Não sei se você considera o wikitext do MediaWiki uma linguagem, mas nomes com espaços são definitivamente idiomáticos:

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

Onde "seção de expansão" é o nome de um modelo (http://en.wikipedia.org/wiki/Template:Expand_section)

Eu acho que ele atende aos critérios - uma linguagem na qual os identificadores rotineiramente contêm espaços. Nunca é (acho?) Ambíguo porque os identificadores estão sempre cercados por muita pontuação para separá-los do texto bruto da wiki.

Steve Bennett
fonte
2
Embora o wikitext certamente seja uma linguagem formal, eu não chamaria de linguagem de programação (nem sequer possui loops).
svick
@svick: Nem Haskell, Smalltalk, Scheme, Clojure, Erlang, Cálculo Lambda, Máquinas de Turing, Io, Ioke, Seph, ...
Jörg W Mittag
@ JörgWMittag, mas eles têm recursão, que é apenas uma maneira diferente de expressar loops. O Wikitexto nem tem isso.
svick
@svick Dependendo de quais extensões você instalou, você obtém algumas estruturas de controle na marcação mediawiki. Em particular, você obtém se ifrecursão. Sintaxe e desempenho são muito ruins. Os modelos se comportam praticamente como funções, e seus nomes contam como identificadores no meu livro.
código é o seguinte
1
Interessante, de [[Wikipedia: Transclusion]]: "Não há nenhuma funcionalidade de loop real incorporada ao software Mediawiki a partir deste momento ... mas existem alguns truques para imitá-los. Por exemplo, chamar repetidamente um modelo que chama repetidamente um modelos diferentes podem imitar um loop duplo. Os modelos também podem ser coagidos a se chamar (normalmente proibido pelo software Mediawiki após uma única instância, para evitar loops infinitos), pelo uso artístico de redirecionamentos (consulte m: Template: Loop1 (backlinks, edit)) Veja também m: Help: Conversão recursiva do wikitext. "
31512 Steve Bennett
9

O Inform 7 é um sistema para desenvolver ficção interativa usando sintaxe semelhante à linguagem natural, na qual identificadores de várias palavras são comuns:

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

A restrição, é claro, é que um identificador não pode conter uma palavra-chave quando isso seria ambíguo.

De maneira semelhante, identificadores com sublinhados no Agda podem ser usados ​​mixfix, cujo exemplo mais simples é provavelmente o if_then_else_operador:

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
fonte
6

Scala permite identificadores arbitrários usando backticks. O uso usual para isso é invocar Thread.`yield`porque yieldé uma palavra reservada em Scala. Isso pode ser (ab) usado para ter espaços nos nomes, embora isso esteja longe do código idiomático do Scala:

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

Caramba, você pode até ter guias nos identificadores:

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

Suponho que isto poderia concebivelmente ser idiomática para o povo de programação alfabetizada. Talvez.

Peter C
fonte
Scala permite caracteres como +nos nomes dos métodos. Portanto obj.a+=1, analisaria como se a+=fosse um método. O inventor Martin Odersky em seu livro-texto assume que os programadores geralmente incluem espaços, de modo que as ambiguidades do analisador não são praticamente muito problemáticas.
Jesvin Jose
1
@aitchnyu: Na verdade, em identificadores mistos, a parte alfanumérica e a parte do operador precisam ser separadas por um sublinhado. obj.a+=1é equivalente ao obj.a += 1que é equivalente a obj.a.+=(1). Você precisaria ter obj.a_+=1se quiser que ele funcione da maneira que descreve. (Na verdade, isso dará um erro de análise, você precisa se quer chamada obj.a_+=(1)ou obj a_+= 1.)
Jörg W Mittag
Isso não é aba ... é uma estação espacial. E por estação espacial, quero dizer uma sequência de escape de tabulação.
Thomas Eding
4

Você pode considerar esse o caso em Cucumber / Gherkin , em que os nomes das funções são efetivamente sentenças com os argumentos incorporados neles.

Como uma extensão, eu esperaria que isso fosse mais comum em pequenas DSLs , onde a linguagem deveria ser amigável para não desenvolvedores. Por exemplo, muitos mecanismos de regras fornecem a capacidade de definir regras com uma descrição semelhante ao inglês, onde espaços podem ser usados ​​em identificadores.

Chris Pitman
fonte
3

FWIW, Tcl permite espaços (e quase todos os outros caracteres) nos identificadores, embora não seja comum tirar proveito desse recurso. O principal motivo pelo qual não é usado com muita frequência é apenas o fato de você precisar usar as aspas apropriadas. Por exemplo, o seguinte define uma variável chamada "meu nome" como "bob" e, em seguida, imprime

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

OTOH, é muito útil ao criar variáveis ​​dinamicamente, pois, ao criar essas variáveis, não é preciso se preocupar com caracteres ilegais

Bryan Oakley
fonte
1

Se você considera um DSL de teste automatizado uma linguagem, a estrutura do robô permite espaços nos nomes das palavras-chave, e é muito idiomático. No exemplo a seguir "Diga olá" é um nome de palavra-chave, "Exemplo de caso de teste" é um nome de caso de teste e "$ {first name}" é uma variável:

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

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

A linguagem 4D permite espaço em branco nos nomes e variáveis ​​dos métodos. Geralmente é desaprovado na comunidade, mas todos os métodos e variáveis ​​internos os usam quando aplicável ( SET MENU ITEM PARAMETERpor exemplo)

3Doubloons
fonte
0

O Smalltalk apresenta métodos de palavras-chave, como os a:b:c:que envolvem espaços em branco quando chamados. Por exemplo: a: 100 b: 200 c: 300. Este é um idioma padrão no idioma.

dharmatech
fonte
0

O PowerShell permite espaços em nomes de variáveis:

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

PS C:\> ${the var}
100
dharmatech
fonte
0

Eu vi menção de similar para VB, mas em JS isso é muito usado na verdade. Qualquer propriedade de um objeto em JavaScript pode ser acessada e configurada em forma de string com colchetes ou simplesmente como strings em literais de objeto. Os nomes de propriedades que não seguem as regras de nomeação de variáveis ​​de JS são inacessíveis via. notação, mas eles são úteis. Por exemplo, você pode mapear URLs para comportamento ou fazer referência a um grupo de pessoas por nome quando tiver certeza de que todas elas são únicas. Geralmente, é muito conveniente e fácil de ler:

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

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

Isso também facilita a reestruturação do JSON para facilitar o uso, sem perder o fator de objeto instantâneo quando inserido no JS.

Erik Reppen
fonte
Engraçado que essa é a única menção ao JavaScript. Sim, métodos e propriedades podem conter seqüências de caracteres: foo['my method']()efoo['my property']
Steve Bennett
0

O Power Query usa muito código gerado automaticamente. Eu acho que mais da metade dos identificadores gerados usam espaço em branco:

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"

Como você pode ver, como em muitos idiomas, há uma sintaxe extra para desambiguar qual é o identificador.

Mas em lugares onde é inequívoco, nenhuma sintaxe extra é necessária:

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

A linguagem de programação o42a que estou desenvolvendo atualmente suporta nomes de várias palavras . O idioma não possui palavras-chave e os nomes geralmente são separados por algum símbolo. Nos casos raros em que os dois nomes se seguem, o sublinhado é usado para separá-los.

lorus
fonte
-4

Editar: Esta resposta foi mostrada como incorreta. Consulte os comentários.

Se entendi sua pergunta corretamente, um compilador não pode permitir espaço (s) no nome do identificador porque pode causar nomes duplicados (a menos que um delimitador seja usado). Por exemplo:

int meu = 0; bool minha contagem = false; int count = 0; se (meu conde) ...

o termo 'minha contagem' é confuso; pode se referir à variável chamada 'minha contagem' ou talvez o desenvolvedor tenha esquecido de escrever um operador de relação como> entre minha e contagem.

O COBOL permitiu que os nomes de divisão e seção fossem separados por espaço, mas esses não são identificadores e variáveis, como na sua pergunta.

Emmad Kareem
fonte
4
Bem, não é o compilador, é a definição da linguagem. A maioria dos idiomas não pode permitir espaços em branco nos identificadores porque eles criariam ambiguidade.
21412 Steve Bennett
2
Seu raciocínio parece meio duvidoso para mim. No seu exemplo, a única alternativa para my Countser um nome de variável seria o programador ter feito um erro de digitação. Isso não é ambiguidade. A ambiguidade seria se houvesse outra maneira válida de analisar a expressão. Pelo mesmo raciocínio, você poderia dizer que permitir a(b+c)é ambíguo porque talvez o programador tenha esquecido um >e realmente quis dizer a > (b + c).
sepp2k
1
Mas (em uma linguagem que permite espaços em nomes de variáveis) também não há ambiguidade em if (my count). Você não está dizendo que existe uma maneira diferente e válida de analisar essa declaração (o que significa que é ambígua). Você está dizendo que, se você adicionar o personagem <, terá uma análise diferente e válida. E eu estou dizendo que se você adicionar o personagem <para a(b+c)você também acabar com uma análise diferente, válido.
sepp2k
1
@SteveBennett Right. Qualquer linguagem que permitisse espaços nos nomes de variáveis ​​teria que desaprová-los nos nomes dos tipos ou usar uma sintaxe diferente para as declarações de tipo (como por exemplo var name of the variable : type of the variable) - ou não possuir nenhuma declaração de tipo.
sepp2k
1
@ sepp2k, agora entendi seu ponto. Obrigado por reservar um tempo para esclarecer. Minha resposta está incorreta.
NoChance