En la mayoría de los lenguajes de programación, las variables no tienen caracteres de identificación como en PHP. En PHP debe anteponer una variable con el $
carácter.
Ejemplo;
var $foo = "something";
echo $foo;
Estoy desarrollando un nuevo lenguaje de secuencias de comandos para una aplicación comercial, y mis usuarios objetivo no tienen experiencia en programación. ¿Estos caracteres hacen que el código sea más fácil de leer y usar?
Una razón por la que PHP usa el $
es porque sin él PHP no puede decir si un nombre es una referencia de función o referencia de variable. Esto se debe a que el lenguaje permite referencias extrañas a las funciones. Entonces, el $
símbolo ayuda al analizador a separar el espacio de nombres.
No tengo este problema en mi analizador. Entonces mi pregunta es puramente legible y fácil de usar. He codificado durante tantos años en PHP que cuando veo $foo
es fácil para mí identificar esto como una variable. ¿Solo estoy dando preferencia a este identificador?
fuente
sigils
tres veces hoy en conversaciones.var $x = ...
otype $x = ...
entonces creo que $ es exagerado. Si lo hubiera hecho,$x = ...
entonces valdría la pena hacerlo. Especialmente si no desea admitir el resaltado de sintaxis en editores comunes. Sin embargo, como preferencia, no me gustasigils
Respuestas:
Las posibilidades y limitaciones técnicas reales no son nada de lo que se sugiere a lo largo de este hilo. Vamos a aclarar esos primero.
Esto es lo que $ hace posible en PHP:
$return
o poder usar el mismo nombre para una variable y una función / constante, por ejemplo$__FILE__
Limitaciones o características que no están relacionadas con el prefijo $:
Eso significa que no hay ninguna razón técnica que no puedas tener
o
Sin embargo, no puede tener (suponiendo que
return
es una palabra clave)Sin complicaciones serias. Si utilizó un prefijo como
$
, entonces no habría sido ningún problema.Es una opinión, pero creo que un sigilo valdría la pena para los no programadores, ya que les permite usar palabras clave como nombres de variables, para ellos de otra manera parecería una limitación arbitraria: P
fuente
return = "something";
, C # tiene "palabras clave contextuales", que también es una opción que vale la pena consultar al diseñar lenguajes.@return = "something;"
. Hay cierta cantidad de palabras clave contextuales, sí, pero hacer que todas ellas sean contextuales significaría una implementación mucho más complicada.Los sellos realmente tienen mucho más sentido en Perl, donde proporcionan una cierta cantidad de verificación de tipo. En php no ayudan mucho fuera de la plantilla. Puede tener una idea de su utilidad y legibilidad mirando diferentes idiomas. Casi nadie los usa.
En un lenguaje dirigido al usuario final en el que estoy trabajando, incluso voy más allá, haciendo que los identificadores no distingan entre mayúsculas y minúsculas y permitiendo espacios y apóstrofes. Eso me permite hacer que nombres de variables como
Karl's height
ese estén mucho más cerca de los lenguajes naturales.fuente
At Karl's for the night = true;
map sum
es una llamada de función parcialmente aplicada: la funciónsum
se pasa como un parámetro amap
. Pero ambos son solo nombres de biblioteca, por lo que con los identificadores de varias palabras, el compilador no podría saber si semap sum
trata de un identificador de varias palabras o una aplicación de función basada en dos identificadores de una sola palabra.Hace años, aprendí Applesoft Basic. Las cadenas siempre tenían el sufijo
$
y las matrices tenían un sufijo de%
. Así es como funcionaba el lenguaje. Miraste algo, sabías lo que era. Nunca profundicé demasiado en el intérprete para entender por qué este era el caso o las decisiones de diseño que lo hicieron así.El sigilo en php proviene de su influencia perl (que fue influenciada por
awk
ysh
). El sigilo en perl es bastante más que solo$
ya que puede identificar muchos tipos diferentes:$
escalar@
lista%
picadillo&
bloque de código*
typeglobEl sigilo identifica qué parte de la estructura de la tabla de símbolos está mirando. Detrás de escena, la entrada de la tabla de símbolos para foo (a la que se accede mediante
*foo
- the typeglob) tiene todo lo que puede ser un foo. Hay$foo
,@foo
,%foo
, el formatofoo
,&foo
el gestor de archivo foo, etc ...Esto también permite hacer un alias de una variable a otra:
Esto imprime
foo 1 2
: en perl, para eso están realmente los sigilos , no para que debas hacer esto, sino para que haya algo detrás de escena que hacen.Los sigilos no existen tanto para la legibilidad, sino para que uno pueda tener
$foo
y@foo
sin tener una colisión en el espacio de nombres (compare otros idiomas donde no se pueden tener ambosint foo; int[] foo;
)Los signos de legibilidad son algo que se aprende como parte de cualquier lenguaje: leer la sintaxis. Hipotéticamente, podría forzar el tipo en sí (como notación húngara) como parte del identificador.
Algo en Lex a lo largo de las líneas de:
Y luego podrías tener un código como
No digo que sea una buena idea, sino que alguien que esté acostumbrado al idioma pueda leerlo de forma nativa y piense que mejora la legibilidad, mientras que alguien que no está familiarizado con el idioma puede pensar que simplemente agrega Un montón de ruido al idioma.
Sin embargo, después de trabajar con un lenguaje definido de esta manera, probablemente podría leerlo sin problemas.
A algunas personas les gustan, a otras no. Hay grandes guerras santas en varios foros que debaten esto y realmente se reduce a cuánto las has usado.
Se podría diseñar un nuevo lenguaje para los no programadores que usa sigilos y cualquiera que nunca haya programado antes nunca se quejará un poco de ellos. Por otro lado, no podría tenerlos como parte del lenguaje y luego hacer que los programadores de ruby o perl se quejen de que se están perdiendo alguna información clave.
Realmente no importa. Lo que importa es cómo los sigilos encajarían en el idioma si los usas o no. ¿Quieres poder hacer
"123 $foo 456"
o debes hacer"123 " + foo + " 456"
? Aquí es donde se debe tomar la decisión.fuente
"123 $foo 456"
no está habilitada por el prefijo sigil y es completamente ortogonal a ella.$asd
en la sintaxis de interpolación de cadenas si$
ya se usaba para prefijos variables, pero no tenía nada que ver con la posibilidad real de implementar la interpolación de cadenas en primer lugar.#
que se usa en coffeescript, por ejemplo. Y coffeescript no tiene prefijo variables con#
- de hecho no tiene prefijos variables)No estoy de acuerdo con que PHP use $ para diferenciar los vars de los funcs. Al menos porque PHP tiene una sintaxis tipo C y los funcs () tienen parens después del nombre.
Lea esta publicación en el desbordamiento de pila sobre por qué $ está en PHP.
Muchos lenguajes populares, como C, C ++, C #, Java no usan $ y podemos diferir fácilmente de la función var.
En PHP $ ayuda, por ejemplo, cuando escribe: echo "var = $ var"
Sin $ tal truco será imposible.
fuente
echo "var = $var"
fn()[]
dónde, como con una gramática sensata, que hubiera funcionado de inmediato sin siquiera pensarlo.Después de todas estas respuestas, quiero darle más puntos a Mathew Foscarini.
son efectos secundarios de este LEXER , porque es capaz de reconocer un token.
Tomemos como ejemplo: en SQL usamos "" para poder usar identificadores con palabras reservadas e incluso identificadores con espacios "Nombre", "Nombre del grupo". GRUPO es una palabra clave. Hubo un problema, hubo una solución especial.
PD: Muy buen comentario de MichaelT.
fuente
$
. Además, la "capacidad de colocar variables dentro de una cadena" no se debe a que las variables tengan como prefijo un símbolo como$
. Es decir,"123 $foo 456"
funcionará incluso si la sintaxis variable es comofoo = 3
o@foo = 3
. No están relacionados entre sí.... un sigilo permite:
Distinguir mejor las variables de las no variables . Las personas que todavía están aprendiendo conceptos básicos pueden tener problemas para descubrir qué palabras son variables y cuáles no. A menudo comienzan leyendo ejemplos o el código de otras personas sin antecedentes adecuados.
Use palabras clave reservadas o nombres de funciones como nombres de variables . A veces descubrí que algunos de esos nombres eran los correctos para una variable (es decir,
$count
aunque había unacount()
función definida) y agradecí a sigils por permitirme usarlos.fuente
$
signo. Recuerdo que el signo del dólar me confundía cuando era niño debido a su asociación monetaria inherente.%
podría ser una alternativa factible