В программировании, сигил[1][2] — это символ, прикреплённый к имени переменной, обозначающий тип данных или область видимости, как правило, префикс, как в $foo
, где $
является сигилом.
Sigil от латинского sigillum, что означает «маленький знак», означает знак или изображение, предположительно обладающее магической силой.[3] Сигилы могут использоваться для разграничения пространств имён, которые обладают разными свойствами и поведением.
Исторический контекст
Использование сигилов было популяризировано языком программирования Бейсик. Самый известный пример сигила в BASIC — знак доллара («$
»), добавляемый к именам всех строк. Многие диалекты BASIC используют и другие сигилы (например, «%
») для обозначения целых чисел, чисел с плавающей запятой и, иногда, других типов.
Ларри Уолл добавил сигилы в свой язык программирования Perl, подражая сигилам в сценариях командной строки.[источник не указан 1253 дня] В Perl сигилы определяют не типы данных, такие как строки и целые числа, а более общие категории: скаляры (префикс «$
» от англ. scalar), массивы (префикс «@
» от англ. array), хеши (префикс «%
») и подпрограммы («&
»). Язык Raku также использует вспомогательные сигилы, располагающиеся между сигилами и названиями переменных, твигилы,[4] для обозначения областей видимости переменных. Яркие примеры твигилов в Raku: «^
», используемый с самопровозглашёнными в теле блока или подпрограммы позиционными аргументами этого блока или подпрограммы; «.
», используемый с атрибутами объектов (свойствами и методами).
В CLIPS, у скалярных переменных префикс «?
», а у множественных (например, одноуровневых списков) — префикс «$?
».
В Common Lisp переменные с динамической областью видимости обычно заключаются в «*
» («earmuff convention»). Хотя это всего лишь соглашение, и вовсе не обязательно так делать, сам язык использует эту практику (например, *standard-output*
). Некоторые программисты заключают константы в «+
».
В CycL перед переменными стоит знак «?
».[5] Имена констант начинаются с префикса «#$
» (произносится как «хеш-доллар»).[6]
В Elixir сигилами называются формы синтаксиса, начинающиеся с символа «~
», позволяющие объявлять регулярные выражения, строковые литералы, списки, даты.[7][8]
В MAPPER (он же BIS), именованные переменные берутся в треугольные скобки, так как строки и символы не требуют кавычек.
В сценариях MIRC, идентификаторы (возвращают вычисляемые значения[9]) пишутся с префиксом «$
», а переменные — с префиксом «%
» (как локальные, так и глобальные). У переменных для двоичных данных произвольного размера — префикс «&
».
В языке программирования MUMPS символ «$
» предшествует именам системных функций и «именам специальных переменных» (системным переменным для доступа к состоянию выполнения). Сигил «$Z
» предшествует именам нестандартных системных функций. Сигил «$$
» предшествует именам пользовательских функций. Имена подпрограмм (в некоторых случаях) и глобальных переменных (хранятся на диске), начинаются с символа «^».
В Objective-C строковые литералы, которым предшествует «@
», являются экземплярами класса NSString
или, начиная с clang v 3.1 / LLVM v 4.0, NSNumber
, NSArray
или NSDictionary
. Префикс «@
» также используется в ключевых словах @interface
, @implementation
и @end
, используемых в синтаксисе определения классов. В классах также используется префикс «-
» для обозначения методов и полей экземпляра (объекта), а префикс «+
» указывает на элементы класса (то есть типа объектов).
В языке PHP, который во многом был вдохновлён Perl, «$
» стоит перед именами всех переменных. Имена без этого префикса считаются константами, именами функций или классов (или именами интерфейсов или типажей, которые используют то же пространство имен, что и классы).
PILOT использует «$
» для буферов (строковых переменных), «#
» для целочисленных переменных и «*
» для меток.
Python использует «@
» (pie syntax) для навешивания декораторов[10] и «__
», (dunder) для «приватных» членов класса.
В Ruby у обычных переменных нет сигилов, но перед глобальными переменными ставится «$
», перед переменными экземпляров ставится префикс «@
», а перед переменными класса — префикс «@@
». В Ruby также используются (строго конвенциональные) суффиксные сигилы: «?
» указывает метод предиката, возвращающий булевое значение; «!
» указывает, что метод может иметь потенциально неожиданный эффект и требует осторожного обращения.[11]
В Scheme по соглашению имена процедур, которые всегда возвращают логическое значение, обычно оканчиваются на «?
». Имена процедур, которые хранят значения в частях предварительно выделенных объектов Scheme (таких как пары, векторы или строки), обычно заканчиваются на «!
».
Standard ML использует префиксный сигил «'
» для переменных, которые относятся к типам. Если сигил удваивается, это относится к типу, для которого определено равенство. Символ «'
» также может появляться внутри или в конце имён переменных, и в этом случае у него нет чёткого значения.
В Transact-SQL символ «@
» предшествует имени локальной переменной или параметра. Системные переменные (известные как глобальные переменные) выделяются с помощью «@@
».
В Windows PowerShell, который частично был вдохновлён оболочкой Unix и Perl, имена переменных начинаются с символа «$
».
В XSLT у переменных и параметров при использовании есть префикс «$
», хотя при определении в <xsl:param>
или <xsl:variable>
в атрибуте name
сигил не добавляется. Связанный с XSLT язык XQuery использует «$
» как в определении, так и при использовании.
В MEL у имён переменных есть префикс «$
», чтобы их можно было отличать от функций, команд и других идентификаторов.
Похожие явления
Переменные командной оболочки
В Unix shell и таких утилитах, как Makefiles, «$
» — это унарный оператор, переводящий имя переменной в её содержимое. Несмотря на внешнее сходство, знак в данном случае не является частью имени, что заметно по его отсутствию в присваивании. Аналог в Си — оператор разыменования указателей.
Соглашения об идентификаторах
В Фортране сигилы не используются, но все переменные, начинающиеся с букв I, J, K, L, M и N, по умолчанию являются целыми числами.[12] В документации Fortran это называется «неявная типизация», хотя всегда доступна явная типизация, позволяющая объявить любую переменную с любым типом. Выбор диапазона I-N соответствует традиционным соглашениям об именах переменных в математике.
Различные языки программирования, включая Prolog, Haskell, Ruby и Go, обрабатывают идентификаторы, начинающиеся с заглавной буквы, иначе, чем идентификаторы, начинающиеся с маленькой буквы.
Stropping
В Microsoft .NET Common Language Infrastructure (CLI) есть способ экранирования переменных на вызываемом языке, которые могут быть ключевыми словами на вызывающем языке, называемый в англоязычных источниках stropping[англ.][13]. Иногда это делается с помощью префиксов. Например, в C# имена переменных могут начинаться с префикса «@
».[14] В VB.Net для той же цели используются квадратные скобки.[15]
Венгерская нотация
С сигилами связана венгерская нотация — соглашение об именах переменных, которое определяет тип переменной путём добавления определённых буквенных префиксов к имени переменной. В отличие от сигилов, венгерская нотация не предоставляет компилятору никакой информации; типы должны быть явно указаны для переменных (если не используется язык с выводом типов). Поскольку большинство стандартных компиляторов не предписывают использование префиксов, это позволяет совершать ошибки и делает код подверженным путанице из-за случайного неверного использования.[16]
Буквенные аффиксы
В то время как сигилы применяются к именам (идентификаторам), аналогичные префиксы и суффиксы могут применяться к литералам, особенно к целочисленным и строковым, определяя либо способ интерпретации литерала, либо его тип данных. Например, 0x10ULL
расценивается как значение 16 с типом данных unsigned long long
в C++: 0x
указывает, что это шестнадцатеричное число, а суффикс ULL
обозначает тип. Префиксы часто используются для обозначения строк без экранирования символов. Например r"C:\Windows"
в Python в виде экранированной строки было бы записано как "C:\\Windows"
.
Поскольку это влияет на семантику (значение) литерала, а не на синтаксис или семантику идентификатора (имени), это не stropping (синтаксис идентификатора) и не сигил (семантика идентификатора), несмотря на синтаксическое сходство.
Аннотации Java
Например, встроенные аннотации Java, такие как @Override
и @Deprecated
.
Путаница
В некоторых случаях один и тот же синтаксис может использоваться для разных целей, что может вызвать путаницу. Например, в C# префикс «@
» может использоваться и как stropping, и как префикс к литералу (для обозначения неэкранированных строк); в этом случае ни одно использование не является сигилом, поскольку оно влияет на синтаксис идентификаторов или семантику литералов, а не на семантику идентификаторов.
См. также
Примечания
- ↑ Владимир Леттиев. Pragmatic Perl 13: Сигнатура функции в Perl 5.20 (рус.). Pragmatic Perl (13 марта 2014). — «...можно использовать обычный сигил [...] В данном примере функцию интересуют только первый и четвёртый аргументы. Для остальных аргументов указаны заполнители позиций: сигилы $ и @, они не будут определяться внутри функции.» Дата обращения: 13 сентября 2021. Архивировано 13 сентября 2021 года.
- ↑ Андрей Шитов. Pragmatic Perl 22: Perl 6 XXI века (рус.). Pragmatic Perl (22 декабря 2014). — «В Perl 6 для переменных используются сигилы, частично совпадающие с тем, что есть в Perl 5. В частности, скаляры, списки и хеши используют, соответственно, сигилы $, @ и %.» Дата обращения: 13 сентября 2021. Архивировано 13 сентября 2021 года.
- ↑ Definition of sigil (неопр.). Collins English Dictionary. Дата обращения: 22 мая 2012. Архивировано 1 мая 2021 года.
- ↑ «Perl 6 variables:Twigils» Архивная копия от 17 июня 2016 на Wayback Machine, Perl 6 Documentation
- ↑ Variables – Cycorp (неопр.). www.Cyc.com. Дата обращения: 31 декабря 2017. Архивировано 25 января 2018 года.
- ↑ Constants – Cycorp (неопр.). www.Cyc.com. Дата обращения: 31 декабря 2017. Архивировано 25 января 2018 года.
- ↑ Сигилы (рус.). Эликсир и Вунш (2020). Дата обращения: 13 сентября 2021. Архивировано 13 сентября 2021 года.
- ↑ Sigils (англ.). elixir-lang.github.com. Дата обращения: 27 июля 2021. Архивировано 2 августа 2021 года.
- ↑ mIRC Help (неопр.). www.mirc.com. Дата обращения: 27 июля 2021. Архивировано 9 августа 2021 года.
- ↑ PEP 318 -- Decorators for Functions and Methods (неопр.). Дата обращения: 9 августа 2021. Архивировано 3 июня 2020 года.
- ↑ Black, David A. Bang methods; or, Danger, Will Rubyist! (неопр.) (15 августа 2007). Архивировано 22 мая 2016 года.
- ↑ Rules for Data Typing (FORTRAN 77 Language Reference) (неопр.). docs.oracle.com. Дата обращения: 4 августа 2021. Архивировано 25 февраля 2021 года.
- ↑ King, Peter R., ed. (18 июня 1974). "Proceedings of an International Conference on ALGOL 68 Implementation". Proceedings of an International Conference on ALGOL 68 Implementation. Department of Computer Science, University of Manitoba, Winnipeg: University of Manitoba, Department of Computer Science: 148. ISBN 9780919628113. Архивировано 9 августа 2021. Дата обращения: 9 августа 2021.
More serious problems are posed by "stropping", the technique used to distinguish boldface text from roman text. Some implementations demand apostrophes around boldface (whence the name stropping); others require backspacing and underlining; […]
- ↑ C# Keywords (неопр.). MSDN. Дата обращения: 23 марта 2011. Архивировано 28 января 2017 года.
- ↑ string (C# Reference) (неопр.). MSDN. Дата обращения: 23 марта 2011. Архивировано 14 марта 2011 года.
- ↑ Linux kernel coding style Архивная копия от 9 августа 2021 на Wayback Machine, by Linus Torvalds