Sigilo (programación)

En programación , un sigilo [1] [2]  es un carácter adjunto a un nombre de variable que denota un tipo de datos o alcance , generalmente un prefijo, como en $foodónde $está el sigilo.

Sigil , del latín sigillum , que significa "pequeño signo", significa una señal o imagen supuestamente de poder mágico . [3] Los sigilos se pueden usar para delimitar espacios de nombres , que tienen diferentes propiedades y comportamientos.

Contexto histórico

El uso de sigilos fue popularizado por el lenguaje de programación BASIC . El ejemplo más famoso de un sigilo en BASIC es el signo de dólar (“ $”) agregado a los nombres de todas las cadenas . Muchos dialectos de BASIC también usan otros sigilos (como " %") para representar números enteros , números de coma flotante y, a veces, otros tipos.

Larry Wall agregó sigilos a su lenguaje de programación Perl , emulando sigilos en  secuencias de comandos de línea de comandos . En Perl, los sigilos no definen tipos de datos como cadenas y enteros, sino categorías más generales: escalares (prefijo " $" del  inglés  scalar ), matrices (prefijo " @" del  inglés  array ), hashes (prefijo “ %”) y  subrutinas (“ &”). El lenguaje Raku también usa sigilos auxiliares entre sigilos y nombres de variables, twigils , [4] para indicar alcances variables. Ejemplos vívidos de twigils en Raku: “ ^”, usado con argumentos posicionales de este bloque o subrutina autodeclarada en  el cuerpo de un bloque o subrutina; " ." utilizado con atributos de objeto (propiedades y métodos).

En CLIPS , las variables escalares tienen el prefijo " ?" y las variables múltiples (como las listas de un solo nivel) tienen el prefijo " $?".

En Common Lisp , las variables de alcance dinámico generalmente se encierran entre " *" ("convención de orejera"). Aunque esto es solo una convención, y no es necesario hacerlo en absoluto, el propio lenguaje utiliza esta práctica (por ejemplo, *standard-output*). Algunos programadores encierran constantes con " +".

En CycL, las variables están precedidas por un ?signo " ". [5] Los nombres constantes comienzan con el prefijo " #$" (pronunciado "dólar hash"). [6]

En Elixir , los sigilos son formas de sintaxis que comienzan con el carácter " ~", lo que le permite declarar expresiones regulares, cadenas literales, listas, fechas. [7] [8]

En MAPPER (también conocido como BIS), las variables con nombre se encierran entre corchetes triangulares, ya que las cadenas y los caracteres no requieren comillas.

En los scripts MIRC , los identificadores (que devuelven valores calculados [9] ) se escriben con un $prefijo “ ” y las variables se escriben con un prefijo “ ” %(tanto locales como globales). Las variables para datos binarios de tamaño arbitrario tienen el prefijo " &".

En el lenguaje de programación MUMPS , el carácter " $" precede a los nombres de funciones del sistema y "nombres de variables especiales" (variables del sistema para acceder al estado de ejecución). El sigilo " $Z" precede a los nombres de las funciones del sistema no estándar. El sigilo " $$" precede a los nombres de las funciones definidas por el usuario. Los nombres de subrutinas ( en algunos casos ) y variables globales (almacenadas en disco) comienzan con el carácter "^".

En Objective-C , los literales de cadena precedidos por " @" son instancias de la clase NSStringo, desde clang v3.1 / LLVM v4.0 NSNumber, NSArrayo NSDictionary. El prefijo " " también se @usa en las palabras clave @interfacey en la sintaxis de definición de clases. Las clases también usan el prefijo “ ” para indicar métodos y campos de una instancia (objeto), y el prefijo “ ” indica miembros de una clase (es decir, un tipo de objeto). @implementation@end-+

En el lenguaje PHP , que se inspiró en gran medida en Perl, " $" precede a todos los nombres de variables. Los nombres sin este prefijo se consideran nombres de constantes , funciones o clases (o nombres de características o interfaces que comparten el mismo espacio de nombres que las clases).

PILOT usa " $" para buffers (variables de cadena), " #" para variables enteras y " *" para etiquetas .

Python usa " @" ( sintaxis circular) para decoradores [10] y " __", ( dunder ) para miembros de clase "privados".

En Ruby , las variables regulares no tienen sellos, pero las variables globales tienen el prefijo " ", $las variables de instancia tienen el prefijo " @" y las variables de clase tienen el prefijo " @@". Ruby también usa sigilos de sufijo (estrictamente convencionales): " ?" especifica un método de predicado que devuelve un valor booleano ; " !" indica que el método puede tener un efecto potencialmente inesperado y debe manejarse con cuidado. [once]

En Scheme , por convención, los nombres de los procedimientos que siempre devuelven un valor booleano suelen terminar en " ?". Los nombres de los procedimientos que almacenan valores en partes de objetos Scheme preasignados (como pares, vectores o cadenas) suelen terminar en " !".

Standard ML usa el prefijo sigil " '" para variables que se refieren a tipos. Si el sigilo se duplica, se refiere al tipo para el que se define la igualdad. El símbolo " '" también puede aparecer dentro o al final de los nombres de las variables, en cuyo caso no tiene un significado claro.

En Transact-SQL, el carácter " @" precede al nombre de una variable o parámetro local. Las variables del sistema (conocidas como variables globales) están marcadas con " @@".

En Windows PowerShell , que se inspiró en parte en el shell de Unix y Perl, los nombres de las variables comienzan con un $carácter " ".

En XSLT , las variables y los parámetros tienen el prefijo " " cuando se usan , aunque no se agrega ningún sigilo $cuando se define en <xsl:param>o <xsl:variable>en un atributo . nameEl lenguaje relacionado con XSLT, XQuery , utiliza " $" tanto en la definición como en el uso.

En MEL, los nombres de variables tienen el prefijo " $" para distinguirlos de funciones, comandos y otros identificadores.

Fenómenos similares

Variables de shell

En  el shell de Unix y utilidades como Makefiles , " $" es un operador unario que traduce el nombre de una variable en su contenido. A pesar de la similitud externa, el signo en este caso no forma parte del nombre, lo que se nota por su ausencia en la cesión. El análogo en  C es el operador de desreferenciación de punteros.

Convenciones de identificadores

Los sigilos no se usan en  Fortran , pero todas las variables que comienzan con las letras I, J, K, L, M y N son números enteros por defecto . [12] En la documentación de Fortran, esto se denomina "tipado implícito", aunque el tipado explícito siempre está disponible, lo que permite declarar cualquier variable con cualquier tipo. La elección del rango IN sigue las convenciones tradicionales de nomenclatura de variables en matemáticas .

Varios lenguajes de programación, incluidos Prolog , Haskell , RubyGo, tratan los identificadores que comienzan con una letra mayúscula de manera diferente a los que comienzan con una letra minúscula.

Flejado

La infraestructura de lenguaje común (CLI) de Microsoft .NET tiene una forma de escapar de las variables en el idioma llamado que pueden ser palabras clave en el idioma llamado, llamado stropping [13] en fuentes en inglés . A veces esto se hace con prefijos. Por ejemplo, en  C# , los nombres de las variables pueden comenzar con un prefijo " " . [14] VB.Net  usa corchetes con el mismo propósito. [quince]@

Notación húngara

Asociada con los sigilos está la notación húngara  , una convención de nomenclatura de variables que determina el tipo de una variable agregando ciertos prefijos de letras al nombre de la variable. A diferencia de los sigilos, la notación húngara no proporciona información al compilador; los tipos deben especificarse explícitamente para las variables (a menos que se utilice un  lenguaje de inferencia de tipos ). Dado que la mayoría de los compiladores estándar no exigen el uso de prefijos, esto permite que se cometan errores y hace que el código sea propenso a la confusión debido a un mal uso accidental. [dieciséis]

Suplementos de letras

Si bien los sigilos se aplican a los nombres (identificadores), los prefijos y sufijos similares se pueden aplicar a los  literales , especialmente a los números enteros y las cadenas, especificando cómo se interpreta el literal o su tipo de datos. Por ejemplo, se 0x10ULLtrata como el valor 16 con un tipo de datos C++ unsigned long long:  indica que 0xes un número hexadecimal y el sufijo ULLindica el tipo. Los prefijos se utilizan a menudo para marcar cadenas sin caracteres de escape . Por ejemplo r"C:\Windows", en Python, una cadena con escape se escribiría como "C:\\Windows".

Debido a que afecta la semántica (significado) del literal, y no la sintaxis o la semántica del identificador (nombre), no es ni stropping (sintaxis del identificador) ni sigilo (semántica del identificador), a pesar de las similitudes sintácticas.

Anotaciones de Java

Por ejemplo, las anotaciones de Java integradas como . @Override@Deprecated

Confusión

En algunos casos, la misma sintaxis se puede usar para diferentes propósitos, lo que puede causar confusión. Por ejemplo, en  C# , el prefijo " " @se puede usar tanto como un stropping como un prefijo de un literal (para indicar cadenas sin escape); en este caso, ningún uso es un sigilo porque afecta la sintaxis de los identificadores o la semántica de los literales, no la semántica de los identificadores.

Véase también

Notas

  1. Vladímir Lettiev. Pragmatic Perl 13: Firma de función en Perl 5.20 . Pragmatic Perl (13 de marzo de 2014). — “... puedes usar un sigilo regular [...] En este ejemplo, la función solo está interesada en el primer y cuarto argumento. Los marcadores de posición se especifican para el resto de los argumentos: los sigilos $ y @, no se definirán dentro de la función.". Consultado el 13 de septiembre de 2021. Archivado desde el original el 13 de septiembre de 2021.
  2. Andréi Shitov. Pragmatic Perl 22: Perl 6 para el siglo XXI . Pragmatic Perl (22 de diciembre de 2014). "Perl 6 usa sigilos para las variables que se superponen con Perl 5. En particular, los escalares, las listas y los hash usan los sigilos $, @ y %, respectivamente". Consultado el 13 de septiembre de 2021. Archivado desde el original el 13 de septiembre de 2021.
  3. Definición de sigilo . Diccionario collins de ingles . Consultado el 22 de mayo de 2012. Archivado desde el original el 1 de mayo de 2021.
  4. "Perl 6 variables:Twigils" Archivado el 17 de junio de 2016 en Wayback Machine , Documentación de Perl 6
  5. Variables - Cycorp . www.cyc.com . Consultado el 31 de diciembre de 2017. Archivado desde el original el 25 de enero de 2018.
  6. Constantes-Cycorp . www.cyc.com . Consultado el 31 de diciembre de 2017. Archivado desde el original el 25 de enero de 2018.
  7. Sigilos . Elixir y Wunsh (2020). Consultado el 13 de septiembre de 2021. Archivado desde el original el 13 de septiembre de 2021.
  8. Sigilos  . _ elixir-lang.github.com . Consultado el 27 de julio de 2021. Archivado desde el original el 2 de agosto de 2021.
  9. Ayuda de mIRC . www.mirc.com . Consultado el 27 de julio de 2021. Archivado desde el original el 9 de agosto de 2021.
  10. PEP 318 -- Decoradores de Funciones y Métodos . Consultado el 9 de agosto de 2021. Archivado desde el original el 3 de junio de 2020.
  11. Negro. Métodos de explosión; o, ¡Peligro, Will Rubyist! (15 de agosto de 2007). Archivado desde el original el 22 de mayo de 2016.
  12. Reglas para escribir datos (Referencia del lenguaje FORTRAN 77) . docs.oracle.com . Consultado el 4 de agosto de 2021. Archivado desde el original el 25 de febrero de 2021.
  13. Rey, Peter R., ed. (18 de junio de 1974). “(desconocido)” . Actas de una Conferencia Internacional sobre la Implementación de ALGOL 68 . Departamento de Ciencias de la Computación, Universidad de Manitoba, Winnipeg: Universidad de Manitoba, Departamento de Ciencias de la Computación: 148. ISBN  9780919628113 . Archivado desde el original el 9 de agosto de 2021 . Consultado el 09-08-2021 . Los problemas más serios los plantea el "stropping", la técnica utilizada para distinguir el texto en negrita del texto latino. Algunas implementaciones exigen apóstrofes alrededor de la negrita (de ahí el nombre stropping); otros requieren retroceder y subrayar; […] Parámetro obsoleto utilizado |deadlink=( ayuda )
  14. Palabras clave de C# . MSDN . Consultado el 23 de marzo de 2011. Archivado desde el original el 28 de enero de 2017.
  15. cadena (Referencia de C#) . MSDN . Consultado el 23 de marzo de 2011. Archivado desde el original el 14 de marzo de 2011.
  16. Estilo de codificación del kernel de Linux . Archivado el 9 de agosto de 2021 en Wayback Machine , por Linus Torvalds.