¿El espacio en blanco en los identificadores ha sido idiomático? [cerrado]

43

El estilo C # sugiere usar CamelCase en identificadores para delimitar palabras. La tradición de Lisp sugiere usar guiones en su lugar.

¿Ha existido alguna vez un lenguaje de programación en el que el uso de espacios en los identificadores no solo estaba permitido, sino que también era un idioma comúnmente utilizado al emplear identificadores de varias palabras?

Es posible tener identificadores con espacios en algunas implementaciones de Scheme , pero no es una práctica ampliamente vista. Aquí hay un ejemplo:

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
fuente
Si tiene espacios de nombres, esa es una forma de identificador compuesto. Por ejemplo, C ++: bobs_utilities :: string_functions :: scramble. Este es un nombre, y podemos incluir espacios en blanco arbitrarios si lo deseamos porque es sintaxis, no un token simple. Los nombres con múltiples componentes quieren ser sintaxis abstracta; la información del espacio de nombres de horquillado en un solo identificador es básicamente un truco de "cambio de nombre" para representar la estructura dentro del texto donde le falta el mecanismo para representar la estructura.
Kaz
Bastante común en JS, cuyo autor principal era un chico de Scheme.
Erik Reppen
1
@ErikReppen Hasta donde yo sé, los espacios no son válidos como parte de los identificadores de JavaScript ...
Izkata
No para vars no. Para nombres de propiedades podemos usar cualquier cadena entre paréntesis. por ejemplo, alert({'some Prop':'bob'}['some Prop']);pero si esos nombres de propiedad de cadena fallan en la prueba de identificación / etiqueta, no puede usarlos con notación de puntos.
Erik Reppen
En Ruby puedes: define_singleton_method "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~" do; puts 42; end;y luego puedes: send "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~"pero no es común.
Darek Nędza

Respuestas:

66

Los compiladores de FORTRAN ignoraron los espacios, así que:

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

Eran idénticos en lo que respecta al compilador.

Algunos dialectos de SQL permiten espacios incrustados en los nombres de columna, pero deben estar rodeados por comillas inversas o algún otro delimitador antes de que puedan usarse.

James Anderson
fuente
77
+1, esto es nuevo para mí. Siempre me pregunté por qué solo obtuve una B en Fortran, pero ahora lo sé :)
NoChance
20
El manual FORTRAN de Sun solía incluir esta oración: "La separación constante de palabras por espacios se convirtió en una costumbre general sobre el siglo X d. C. y duró hasta aproximadamente 1957, cuando FORTRAN abandonó la práctica".
Blrfl
26

Visual Basic (y VBScript) también permiten espacios en blanco en los identificadores si rodea el identificador con corchetes.

Dim [Hello World]
[Hello World] = 123

Sin embargo, hacerlo es bastante raro.

Eric Lippert
fuente
13

¿Cuenta SQL?

create table "Registered Members" (
    "Full Name" varchar(100),
    "Mailing Address" varchar(100),
    etc...
);
Barry Brown
fuente
3
Ciertamente es posible, pero no lo llamaría idiomático.
Joachim Sauer
3
Si necesita enmascarar, no parece ser recomendable.
usuario desconocido
11

Así espacio en blanco es todo el espacio en blanco sobre ...:

La mayoría de los lenguajes de programación modernos no consideran la sintaxis de los espacios en blanco (espacios, tabulaciones y líneas nuevas), ignorándolos, como si no estuvieran allí. Consideramos que esto es una gran injusticia para estos miembros perfectamente amigables del conjunto de personajes. ¿Deben ser ignorados, simplemente porque son invisibles? El espacio en blanco es un lenguaje que busca corregir el equilibrio. Los caracteres que no sean espacios en blanco se ignoran; solo los espacios, las pestañas y las nuevas líneas se consideran sintaxis.

Desafortunadamente, Markdown no admite su sintaxis y no puedo mostrarle un código, pero Wikipedia tiene una muestra de código amigable para los humanos .

Yannis
fuente
@ sepp2k Whitespace tiene etiquetas.
Yannis
Oh tienes razon Olvidalo entonces.
sepp2k
"La mayoría de los lenguajes de programación modernos no consideran los caracteres de espacio en blanco". Python sí :)
jadkik94
@ jadkik94 Python usa espacios en blanco, pero para sangría no como identificadores.
yannis
@YannisRizos Oh, sí. Y también es cierto que la mayoría de los idiomas no utilizan espacios en blanco (identificadores o no)
jadkik94
11

En Algol 68 podrías tener espacio en los identificadores (no recuerdo si fueron significativos o no). Pero las palabras clave fueron marcadas por stripping . Usar nombres con espacio en ellos era idiomático (al menos a mi alrededor).

VHDL permite identificadores con espacios significativos de ellos escapó: \foo bar\. Esto permite también utilizar palabras clave como identificador \and\, cualquier carácter \n<42>\sensibilidad y caso en los identificadores ( \Foo\y \foo\son diferentes, mientras que Fooy fooson equivalentes, y diferente de cualquiera \Foo\y\foo\!). Verilog también tiene identificadores espaciados con la mayoría de estas características (los identificadores normales distinguen entre mayúsculas y minúsculas y escapar de ellos innecesariamente no hace otro identificador), pero no permite espacios en ellos. La necesidad de identificadores escapados en VHDL y Verilog proviene del hecho de que a menudo se producen automáticamente a partir de otras fuentes (como esquemáticas) donde los identificadores habitualmente no tienen la misma restricción que en el lenguaje de programación; AFAIK, no se usan idiomáticamente en otras circunstancias.

Un programador
fuente
Me parece recordar (¡mirando hacia atrás a la década de 1980 aquí!) Que CORAL hizo algo similar: podía (y tenía) espacios en blanco en nombres variables, pero las palabras clave tenían comillas (como 'DEFINE'y, un favorito personal) 'COMMENT'. usar el procesador de macro para reemplazarlos con versiones sin comillas).
AAT
10

No sé si consideras que el wikitexto de MediaWiki es un idioma, pero los nombres con espacios son definitivamente idiomáticos:

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

Donde "expandir sección" es el nombre de una plantilla (http://en.wikipedia.org/wiki/Template:Expand_section)

Supongo que cumple con los criterios, un lenguaje en el que los identificadores habitualmente contienen espacios. Nunca es (¿creo?) Ambiguo porque los identificadores siempre están rodeados de muchos signos de puntuación para separarlos del texto wiki sin formato.

Steve Bennett
fuente
2
Si bien wikitext ciertamente es un lenguaje formal, no lo llamaría un lenguaje de programación (ni siquiera tiene bucles).
svick
@svick: Tampoco Haskell, Smalltalk, Scheme, Clojure, Erlang, Lambda Calculus, Turing Machines, Io, Ioke, Seph, ...
Jörg W Mittag el
@ JörgWMittag, pero tienen recursividad, que es solo una forma diferente de expresar bucles. Wikitext ni siquiera tiene eso.
svick
@svick Dependiendo de qué extensiones haya instalado, obtendrá algunas estructuras de control en el marcado de mediawiki. En particular, obtienes ifsy recursividad. Sin embargo, la sintaxis y el rendimiento son bastante malos. Las plantillas se comportan más o menos como funciones, y sus nombres cuentan como identificadores en mi libro.
CodesInChaos
1
Interesante, de [[Wikipedia: Transclusion]]: "No hay una funcionalidad de bucle real integrada en el software Mediawiki a partir de este momento ... pero hay algunos trucos para imitarlos. Por ejemplo, llamar repetidamente una plantilla que llama repetidamente diferentes plantillas pueden imitar un doble bucle. Las plantillas también pueden ser forzadas a llamarse a sí mismas (normalmente prohibido por el software Mediawiki más allá de una sola instancia, para evitar bucles infinitos), mediante el uso ingenioso de redireccionamientos (ver m: Plantilla: Bucle1 (backlinks, editar)) Ver también m: Ayuda: Conversión recursiva de wikitexto ".
Steve Bennett
9

Inform 7 es un sistema para desarrollar ficción interactiva utilizando una sintaxis similar al lenguaje natural, en la que los identificadores de varias palabras son comunes:

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

La restricción, por supuesto, es que un identificador no puede contener una palabra clave cuando esto sería ambiguo.

En una línea similar, los identificadores con guiones bajos en Agda pueden usarse mixfix, el ejemplo más simple de los cuales es probablemente el 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
fuente
6

Scala permite identificadores arbitrarios utilizando backticks. El uso habitual para esto es invocar Thread.`yield`porque yieldes una palabra reservada en Scala. Esto podría (ab) usarse para tener espacios en los nombres, aunque eso estaría lejos de ser un código de Scala idiomático:

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

Diablos, incluso puedes tener pestañas en los identificadores:

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

Supongo que esto podría concebiblemente ser idiomática para la gente programación literaria. Tal vez.

Peter C
fuente
Scala permite caracteres como +en los nombres de métodos. Entonces obj.a+=1, lo analizaría como si a+=fuera un método. El inventor Martin Odersky en su libro de texto supone que los programadores suelen incluir espacios, por lo que las ambigüedades del analizador prácticamente no son demasiado problemáticas.
Jesvin Jose
1
@aitchnyu: En realidad, en los identificadores mixtos, la parte alfanumérica y la parte del operador deben estar separadas por un guión bajo. obj.a+=1es equivalente a lo obj.a += 1que es equivalente a obj.a.+=(1). Necesitaría tenerlo obj.a_+=1si quiere que funcione de la manera que usted describe. (En realidad, eso dará un error de análisis, debe llamar obj.a_+=(1)o obj a_+= 1.)
Jörg W Mittag el
Eso no es una pestaña ... es una estación espacial. Y por estación espacial, me refiero a una secuencia de escape de tabulación.
Thomas Eding
4

Podría considerar que este es el caso en Cucumber / Gherkin , donde los nombres de funciones son efectivamente oraciones con los argumentos incrustados dentro de ellas.

Como extensión, esperaría que esto sea más común en pequeñas DSL , donde se supone que el lenguaje es amigable para los no desarrolladores. Por ejemplo, muchos motores de reglas proporcionan una habilidad para definir reglas con una descripción similar al inglés, donde los espacios se pueden usar en identificadores.

Chris Pitman
fuente
3

FWIW, Tcl permite espacios (y casi todos los demás caracteres) en los identificadores, aunque no es común aprovechar esta característica. La razón principal por la que no se usa con mucha frecuencia es que tiene que usar las citas adecuadas. Por ejemplo, lo siguiente establece una variable llamada "mi nombre" en "bob", luego la imprime

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

OTOH, es muy útil cuando se construyen variables dinámicamente ya que, al crear tales variables, uno no tiene que preocuparse por caracteres ilegales

Bryan Oakley
fuente
1

Si considera que un DSL de prueba automatizado es un lenguaje, el marco del robot permite espacios en los nombres de palabras clave, y es muy idiomático. En el siguiente ejemplo, "Saluda" es un nombre de palabra clave, "Ejemplo de caso de prueba" es un nombre de caso de prueba y "$ {first name}" es una variable:

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

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

El lenguaje 4D permite espacios en blanco en los nombres de los métodos y las variables. Generalmente está mal visto dentro de la comunidad, pero todos los métodos y variables incorporados los usan cuando corresponde ( SET MENU ITEM PARAMETERpor ejemplo)

3Dbloblones
fuente
0

Smalltalk presenta métodos de palabras clave como los a:b:c:que implican espacios en blanco cuando se invocan. Por ejemplo: a: 100 b: 200 c: 300. Este es un idioma estándar en el idioma.

dharmatech
fuente
0

Powershell permite espacios en nombres de variables:

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

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

Vi mención de similar para VB pero en JS esto se usa mucho en realidad. Se puede acceder a cualquier propiedad de un objeto en JavaScript y establecerla en forma de cadena entre corchetes o simplemente como cadenas en literales de objeto. Los nombres de propiedades que no siguen las reglas de nomenclatura variable de JS son inaccesibles a través de. notación pero son útiles. Por ejemplo, es posible que desee asignar URL a comportamiento o hacer referencia a un grupo de personas por nombre cuando esté seguro de que todas son únicas. A menudo es muy conveniente y fácil de leer:

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

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

Esto también facilita la reestructuración de JSON para facilitar su uso sin perder el factor de objeto instantáneo cuando se deja caer en JS.

Erik Reppen
fuente
Es curioso que esta sea la única mención de JavaScript. Sí, los métodos y las propiedades pueden contener cadenas: foo['my method']()yfoo['my property']
Steve Bennett
0

Power Query utiliza una gran cantidad de código generado automáticamente. Supongo que más de la mitad de los identificadores generados usan espacios en blanco:

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 puede ver, como en muchos idiomas hay una sintaxis adicional para desambiguar cuál es el identificador.

Pero en lugares donde no es ambiguo, no se necesita sintaxis adicional:

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

El lenguaje de programación o42a que estoy desarrollando actualmente admite nombres de varias palabras . El idioma no tiene palabras clave y los nombres generalmente se separan con algún símbolo. En el raro caso de que los dos nombres se sucedan, el guión bajo se usa para separarlos.

lorus
fuente
-4

Editar: se demostró que esta respuesta no era correcta, vea los comentarios.

Si entiendo su pregunta correctamente, un compilador no puede permitir espacios en el nombre del identificador porque podría causar nombres duplicados (a menos que se use un delimitador). Por ejemplo:

int my = 0; bool mi cuenta = falso; int cuenta = 0; si (mi conde) ...

el término 'mi cuenta' es confuso, ya sea que podría referirse a la variable llamada 'mi cuenta' o tal vez el desarrollador olvidó escribir un operador de relación como> entre my y count.

COBOL permitió que los nombres de división y los nombres de sección se separen por espacio, pero esos no son identificadores y variables como en su pregunta.

Emmad Kareem
fuente
44
Bueno, no es el compilador, es la definición del lenguaje. La mayoría de los idiomas no pueden permitir espacios en blanco en los identificadores porque crearían ambigüedad.
Steve Bennett
2
Tu razonamiento me parece un poco dudoso. En su ejemplo, la única alternativa a my Countser un nombre variable sería que el programador haya cometido un error tipográfico. Eso no es ambigüedad. La ambigüedad sería si hubiera otra forma válida de analizar la expresión. Por el mismo razonamiento se podría decir que permitir a(b+c)es ambiguo porque quizás el programador olvidó >y realmente quiso decir a > (b + c).
sepp2k
1
Pero (en un lenguaje que permite espacios en nombres de variables) tampoco hay ambigüedad if (my count). No estás diciendo que hay una forma diferente y válida de analizar esa declaración (lo que significaría que es ambigua). Estás diciendo que si agregas el personaje <, terminas con un análisis válido diferente. Y yo estoy diciendo si se agrega el carácter <a la a(b+c)que también termina con un análisis sintáctico diferente, válida.
sepp2k
1
@SteveBennett Derecha. Cualquier lenguaje que permitiera espacios en nombres de variables tendría que no permitirlos en los nombres de tipo o usar una sintaxis diferente para las declaraciones de tipo (como por ejemplo var name of the variable : type of the variable), o no tener declaraciones de tipo en absoluto.
sepp2k
1
@ sepp2k, ahora tengo tu punto. Gracias por tomarse el tiempo para dejarlo claro. Mi respuesta es incorrecta
NoChance