Символ в программировании — это примитивный тип данных , экземпляры которого имеют удобочитаемую форму. Символы могут использоваться в качестве идентификаторов . В некоторых языках программирования они называются атомами . [1] Уникальность обеспечивается путем хранения их в таблице символов . Наиболее распространенным использованием символов программистами является выполнение языкового отражения (особенно для обратных вызовов ), а наиболее распространенным косвенным способом является их использование для создания объектных связей .
В самой тривиальной реализации они по сути являются именованными целыми числами ; например, перечислимый тип в языке C.
Следующие языки программирования обеспечивают поддержку выполнения символов:
Символы в Julia — это интернированные строки, используемые для представления идентификаторов в проанализированном коде Julia ( AST ), а также в качестве имен или меток для идентификации сущностей (например, ключей в словаре). [5]
Символ в Lisp уникален в пространстве имен (или пакете в Common Lisp ). Символы можно проверить на равенство с помощью функции EQ. Программы на Lisp могут генерировать новые символы во время выполнения. Когда Lisp считывает данные, содержащие текстовые представленные символы, существующие символы ссылаются. Если символ неизвестен, считыватель Lisp создает новый символ.
В Common Lisp символы имеют следующие атрибуты: имя, значение, функцию, список свойств и пакет. [6]
В Common Lisp также возможно, что символ не интернирован в пакет. Такие символы могут быть напечатаны, но при обратном чтении необходимо создать новый символ. Поскольку он не интернирован , исходный символ не может быть извлечен из пакета.
В Common Lisp символы могут использовать любые символы, включая пробелы, такие как пробелы и переводы строк. Если символ содержит пробел, его нужно записать как |это символ|. Символы могут использоваться в качестве идентификаторов для любых видов именованных программных конструкций: переменных, функций, макросов, классов, типов, тегов goto и т. д. Символы могут быть интернированы в пакет. [7] Символы ключевых слов являются самооцениваемыми, [8] и интернированы в пакете с именем KEYWORD.
Ниже приведено простое внешнее представление символа Common Lisp :
это-символ
Символы могут содержать пробелы (и все другие символы):
|Это символ с пробелом|
В Common Lisp символы, в печатном представлении которых имеется двоеточие, являются ключевыми символами . Они интернированы в пакете ключевых слов.
:ключевое слово-символ
Печатное представление символа может включать имя пакета. Между именем пакета и именем символа пишутся два двоеточия.
имя-пакета::имя-символа
Пакеты могут экспортировать символы. Тогда между именем пакета и именем символа пишется только одно двоеточие.
пакет:экспортированный-символ
Символы, которые не интернированы в пакет, также могут быть созданы и иметь обозначение:
#:uninterned-символ
В PostScript ссылки на объекты имен могут быть либо литеральными , либо исполняемыми , что влияет на поведение интерпретатора при их обнаружении. Операторы cvx
и cvl
могут использоваться для преобразования между двумя формами. Когда имена создаются из строк с помощью cvn
оператора, набор разрешенных символов не ограничен.
В Прологе символы (или атомы) являются основными примитивными типами данных, похожими на числа. [9] Точная нотация может отличаться в разных диалектах Пролога. Однако она всегда довольно проста (никаких кавычек или специальных начальных символов не требуется).
В отличие от многих других языков, символам можно придать значение , создав некоторые факты и/или правила Пролога.
Следующий пример демонстрирует два факта (описывающих, что такое отец ) и одно правило (описывающее значение слова sibling ). Эти три предложения используют символы (отец, zeus, hermes, perseus и sibling) и некоторые абстрактные переменные (X, Y и Z). Материнское отношение опущено для ясности.
отец ( зевс , гермес ). отец ( зевс , персей ).брат или сестра ( X , Y ) :- отец ( Z , X ), отец ( Z , Y ).
В Ruby символы могут быть созданы с помощью литеральной формы или путем преобразования строки. [1] Их можно использовать в качестве идентификатора или интернированной строки. [10] Два символа с одинаковым содержимым всегда будут ссылаться на один и тот же объект. [11] Считается наилучшей практикой использовать символы в качестве ключей к ассоциативному массиву в Ruby. [10] [12]
Ниже приведен простой пример символьного литерала в Ruby: [1]
my_symbol = :a my_symbol = :"идентификатор"
Строки можно преобразовать в символы и наоборот:
irb(main):001:0> my_symbol = "Привет, мир!" . intern => :"Привет, мир!" irb(main):002:0> my_symbol = "Привет, мир!" . to_sym => :"Привет, мир!" irb(main):003:0> my_string = :hello . to_s => "hello"
Символы — это объекты класса Symbol
в Ruby: [13]
irb(main):004:0> my_symbol = :hello_world => :hello_world irb(main):005:0> my_symbol . длина => 11 irb(main):006:0> my_symbol . класс => Символ
Символы обычно используются для динамической отправки сообщений (вызова методов) объектам:
irb(main):007:0> "aoboc" . split ( "o" ) => ["a", "b", "c"] irb(main):008:0> "aoboc" . send ( :split , "o" ) # тот же результат => ["a", "b", "c"]
Символы как ключи ассоциативного массива:
irb(main):009:0> my_hash = { a : "яблоко" , b : "банан" } => {:a=>"яблоко", :b=>"банан"} irb(main):010:0> my_hash [ :a ] => "яблоко" irb(main):011:0> my_hash [ :b ] => "банан"
В Smalltalk символы могут быть созданы с помощью литеральной формы или путем преобразования строки. Они могут использоваться как идентификатор или интернированная строка. Два символа с одинаковым содержимым всегда будут ссылаться на один и тот же объект. [14] В большинстве реализаций Smalltalk селекторы (имена методов) реализованы как символы.
Ниже приведен простой пример символьного литерала в Smalltalk:
my_symbol := # 'идентификатор' " Символьный литерал " my_symbol := #a " Технически это селекторный литерал. В большинстве реализаций селекторы являются символами, поэтому это также символьный литерал "
Строки можно преобразовать в символы и наоборот:
my_symbol := 'Привет, мир!' asSymbol " => #'Привет, мир!' " my_string := #hello: asString " => 'hello:' "
Символы соответствуют протоколу symbol
, и их класс вызывается Symbol
в большинстве реализаций:
my_symbol := #hello_world my_symbol класс " => Символ "
Символы обычно используются для динамической отправки сообщений (вызова методов) объектам:
" то же, что и 'foo' в: 2 " 'foo' выполнить: #в: с: 2 " => $o "