Símbolo (programação) - Symbol (programming)

Um símbolo em programação de computador é um tipo de dado primitivo cujas instâncias têm uma forma única legível por humanos. Os símbolos podem ser usados ​​como identificadores . Em algumas linguagens de programação , eles são chamados de átomos . A exclusividade é reforçada mantendo-os em uma tabela de símbolos . O uso mais comum de símbolos por programadores é para realizar reflexão de linguagem (particularmente para retornos de chamada ), e mais comum indiretamente é seu uso para criar ligações de objetos .

Na implementação mais trivial , eles são essencialmente denominados inteiros (por exemplo, o tipo enumerado em C).

Apoio, suporte

As seguintes linguagens de programação fornecem suporte de tempo de execução para símbolos:

língua tipo de nome (s) exemplo de literal (s)
ANSI Common Lisp símbolo, palavra-chave símbolo , : palavra-chave
Clojure símbolo, palavra-chave símbolo ' , : palavra-chave
Dart (linguagem de programação) Símbolo #sym
Elixir átomo, símbolo : sym
Erlang átomo sym ou 'sym'
Julia Símbolo : sym
Objective-C SEL @selector (sym)
PICAXE BASIC símbolo símbolo deixe nome = variável
Prolog átomo, símbolo sym ou 'sym'
Rubi Símbolo : sym ou : 'sym'
Scala scala.Symbol 'símbolo
Esquema símbolo sym
Conversa fiada Símbolo #sym ou # 'sym'
SML / NJ Atom.atom
JavaScript (ES6 e posterior) Símbolo Símbolo ("sym");
Wolfram Language Símbolo Símbolo ["sym"] ou sym
K (linguagem de programação) símbolo `sym

Lisp

Um símbolo em Lisp é único em um namespace (ou pacote em Common Lisp ). Os símbolos podem ser testados quanto à igualdade com a função EQ. Os programas Lisp podem gerar novos símbolos em tempo de execução. Quando Lisp lê dados que contêm símbolos representados textualmente, os símbolos existentes são referenciados. Se um símbolo for desconhecido, o leitor Lisp cria um novo símbolo.

Em Common Lisp os símbolos têm os seguintes atributos: um nome, um valor, uma função, uma lista de propriedades e um pacote.

No Common Lisp também é possível que um símbolo não esteja internado em um pacote. Esses símbolos podem ser impressos, mas quando lidos, um novo símbolo precisa ser criado. Uma vez que não está * internado *, o símbolo original não pode ser recuperado de um pacote.

No Common Lisp, os símbolos podem usar quaisquer caracteres, incluindo espaços em branco, como espaços e novas linhas. Se um símbolo contém um caractere de espaço em branco, ele precisa ser escrito como | este é um símbolo |. Os símbolos podem ser usados ​​como identificadores para qualquer tipo de construção de programação nomeada: variáveis, funções, macros, classes, tipos, tags goto e muito mais. Os símbolos podem ser internados em um pacote. Os símbolos de palavra-chave são autoavaliados e internos no pacote denominado KEYWORD.

Exemplos

A seguir está uma representação externa simples de um símbolo Common Lisp :

this-is-a-symbol

Os símbolos podem conter espaços em branco (e todos os outros caracteres):

|This is a symbol with whitespace|

Em Common Lisp, os símbolos com dois pontos à esquerda em suas representações impressas são símbolos de palavras-chave . Eles estão internados no pacote de palavras-chave.

:keyword-symbol

Uma representação impressa de um símbolo pode incluir um nome de pacote. Dois dois pontos são escritos entre o nome do pacote e o nome do símbolo.

package-name::symbol-name

Os pacotes podem exportar símbolos. Então, apenas uma vírgula é escrita entre o nome do pacote e o nome do símbolo.

package:exported-symbol

Símbolos, que não estão internados em um pacote, também podem ser criados e ter uma notação:

#:uninterned-symbol

Prolog

No Prolog , os símbolos (ou átomos) são os tipos de dados primitivos primários, semelhantes aos números. A notação exata pode diferir nos diferentes dialetos do Prolog. No entanto, é sempre muito simples (não são necessárias citações ou caracteres iniciais especiais).

Ao contrário de outras linguagens, é possível dar algum significado aos símbolos criando alguns fatos e / ou regras do Prolog.

Exemplos

O exemplo a seguir demonstra dois fatos (descrevendo o que é pai ) e uma regra (descrevendo o significado de irmão ). Essas três frases usam símbolos (pai, zeus, hermes, perseus e irmão) e algumas variáveis ​​abstratas (X, Y e Z). O relacionamento com a mãe foi omitido para maior clareza.

father(zeus, hermes).
father(zeus, perseus).

sibling(X, Y) :- father(Z, X), father(Z, Y).

Rubi

Em Ruby , os símbolos podem ser criados com a forma literal ou convertendo uma string. Eles podem ser usados ​​como um identificador ou uma string interna. Dois símbolos com o mesmo conteúdo sempre farão referência ao mesmo objeto. É considerada uma prática recomendada usar símbolos como chaves para um array associativo em Ruby.

Exemplos

O seguinte é um exemplo simples de um literal de símbolo em Ruby:

my_symbol = :a
my_symbol = :"an identifier"

Strings podem ser transformados em símbolos, vice-versa:

irb(main):001:0> my_symbol = "Hello, world!".intern 
=> :"Hello, world!"
irb(main):002:0> my_symbol = "Hello, world!".to_sym 
=> :"Hello, world!"
irb(main):003:0> my_string = :hello.to_s
=> "hello"

Símbolos são objetos da Symbol classe em Ruby:

irb(main):004:0> my_symbol = :hello_world
=> :hello_world
irb(main):005:0> my_symbol.length 
=> 11
irb(main):006:0> my_symbol.class 
=> Symbol

Os símbolos são comumente usados ​​para enviar mensagens dinamicamente para (métodos de chamada em) objetos:

irb(main):007:0> "aoboc".split("o")
=> ["a", "b", "c"]
irb(main):008:0> "aoboc".send(:split, "o") # same result
=> ["a", "b", "c"]

Símbolos como chaves de uma matriz associativa:

irb(main):009:0> my_hash = { a: "apple", b: "banana" }
=> {:a=>"apple", :b=>"banana"}
irb(main):010:0> my_hash[:a] 
=> "apple"
irb(main):011:0> my_hash[:b] 
=> "banana"

Conversa fiada

Em Smalltalk , os símbolos podem ser criados com uma forma literal ou convertendo uma string. Eles podem ser usados ​​como um identificador ou uma string interna. Dois símbolos com o mesmo conteúdo sempre farão referência ao mesmo objeto. Na maioria das implementações Smalltalk, os seletores (nomes de métodos) são implementados como símbolos.

Exemplos

A seguir está um exemplo simples de um literal de símbolo em Smalltalk:

my_symbol := #'an identifier' " Symbol literal "
my_symbol := #a               " Technically, this is a selector literal. In most implementations, "
                              " selectors are symbols, so this is also a symbol literal "

Strings podem ser transformados em símbolos, vice-versa:

my_symbol := 'Hello, world!' asSymbol " => #'Hello, world!' "
my_string := #hello: asString         " => 'hello:' "

Os símbolos estão em conformidade com o symbol protocolo e sua classe é chamada Symbol na maioria das implementações:

my_symbol := #hello_world
my_symbol class            " => Symbol "

Os símbolos são comumente usados ​​para enviar mensagens dinamicamente para (métodos de chamada em) objetos:

" same as 'foo' at: 2 "
'foo' perform: #at: with: 2 " => $o "

Referências

  1. ^ a b c Caça, Dave Thomas; Chad Fowler; Andy (2001). Programando Ruby, o guia do programador pragmático; [inclui Ruby 1.8] (2. ed., 10. ed. impressa). Raleigh, NC: The Pragmatic Bookshelf. ISBN   978-0-9745140-5-5 .
  2. ^ Símbolos na página sobre estruturas de dados
  3. ^ Palavras - chave na página sobre estruturas de dados
  4. ^ "Um tour pela linguagem Dart | Símbolos" . Linguagem de programação Dart . Página visitada em 17 de janeiro de 2021 .
  5. ^ Common Lisp HyperSpec, classe de sistema Symbol
  6. ^ Common Lisp HyperSpec, classe de sistema Package
  7. ^ Peter Norvig : Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp , Morgan Kaufmann, 1991, ISBN   1-55860-191-0 , Web
  8. ^ Bratko, Ivan (2001). Programação Prolog para inteligência artificial . Harlow, Inglaterra; Nova York: Addison Wesley. ISBN   978-0-201-40375-6 .
  9. ^ a b Kidd, Eric. "13 maneiras de olhar para um símbolo Ruby" . Hacks aleatórios . Retirado em 10 de julho de 2011 .
  10. ^ "Programming Ruby: The Pragmatic Programmer's Guide" .
  11. ^ "Usando símbolos para o motivo errado" . Notas gnômicas .
  12. ^ "Símbolo" . Documentação Ruby . Retirado em 10 de julho de 2011 .
  13. ^ http://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf Padrão ANSI Smalltalk.