Symbol (programming)
A symbol in computer programming is a primitive data type whose instances have a unique human-readable form. Symbols can be used as identifiers. In some programming languages, they are called atoms.[1] Uniqueness is enforced by holding them in a symbol table. The most common use of symbols by programmers is for performing language reflection (particularly for callbacks), and most common indirectly is their use to create object linkages.
In the most trivial implementation, they are essentially named integers (e.g. the enumerated type in C).
Support
The following programming languages provide runtime support for symbols:
language | type name(s) | example literal(s) |
---|---|---|
ANSI Common Lisp | symbol, keyword | symbol, :keyword |
Clojure | symbol,[2] keyword[3] | 'symbol, :keyword |
Dart (programming language) | Symbol[4] | #sym |
Elixir | atom, symbol | :sym |
Erlang | atom | sym or 'sym' |
Julia | Symbol | :sym |
Objective-C | SEL | @selector(sym) |
PICAXE BASIC | symbol | symbol let name = variable |
Prolog | atom, symbol | sym or 'sym' |
Ruby | Symbol | :sym or :'sym' |
Scala | scala.Symbol | 'symbol |
Scheme | symbol | sym |
Smalltalk | Symbol | #sym or #'sym' |
SML/NJ | Atom.atom | |
JavaScript (ES6 and later) | Symbol | Symbol("sym"); |
Wolfram Language | Symbol | Symbol["sym"] or sym |
K (programming language) | symbol | `sym |
Lisp
A symbol in Lisp is unique in a namespace (or package in Common Lisp). Symbols can be tested for equality with the function EQ. Lisp programs can generate new symbols at runtime. When Lisp reads data that contains textual represented symbols, existing symbols are referenced. If a symbol is unknown, the Lisp reader creates a new symbol.
In Common Lisp symbols have the following attributes: a name, a value, a function, a list of properties and a package.[5]
In Common Lisp it is also possible that a symbol is not interned in a package. Such symbols can be printed, but when read back, a new symbol needs to be created. Since it is not *interned*, the original symbol can't be retrieved from a package.
In Common Lisp symbols may use any characters, including whitespace, such as spaces and newlines. If a symbol contains a whitespace character it needs to be written as |this is a symbol|. Symbols can be used as identifiers for any kind of named programming constructs: variables, functions, macros, classes, types, goto tags and more. Symbols can be interned in a package.[6] Keyword symbols are self-evaluating[7] and interned in the package named KEYWORD.
Examples
The following is a simple external representation of a Common Lisp symbol:
this-is-a-symbol
Symbols can contain whitespace (and all other characters):
|This is a symbol with whitespace|
In Common Lisp symbols with a leading colon in their printed representations are keyword symbols. These are interned in the keyword package.
:keyword-symbol
A printed representation of a symbol may include a package name. Two colons are written between the name of the package and the name of the symbol.
package-name::symbol-name
Packages can export symbols. Then only one colon is written between the name of the package and the name of the symbol.
package:exported-symbol
Symbols, which are not interned in a package, can also be created and have a notation:
#:uninterned-symbol
Prolog
In Prolog, symbols (or atoms) are the primary primitive data types, similar to numbers.[8] The exact notation may differ in different Prolog's dialects. However, it is always quite simple (no quotations or special beginning characters are necessary).
Contrary to other languages, it is possible to give symbols some meaning by creating some Prolog's facts and/or rules.
Examples
The following example demonstrates two facts (describing what father is) and one rule (describing the meaning of sibling). These three sentences use symbols (father, zeus, hermes, perseus and sibling) and some abstract variables (X, Y and Z). The mother relationship has been omitted for clarity.
father(zeus, hermes).
father(zeus, perseus).
sibling(X, Y) :- father(Z, X), father(Z, Y).
Ruby
In Ruby, symbols can be created with a literal form, or by converting a string.[1] They can be used as an identifier or an interned string.[9] Two symbols with the same contents will always refer to the same object.[10] It is considered a best practice to use symbols as keys to an associative array in Ruby.[9][11]
Examples
The following is a simple example of a symbol literal in Ruby:[1]
my_symbol = :a
my_symbol = :"an identifier"
Strings can be coerced into symbols, 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"
Symbols are objects of the Symbol
class in Ruby:[12]
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
Symbols are commonly used to dynamically send messages to (call methods on) objects:
irb(main):007:0> "aoboc".split("o")
=> ["a", "b", "c"]
irb(main):008:0> "aoboc".send(:split, "o") # same result
=> ["a", "b", "c"]
Symbols as keys of an associative array:
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"
Smalltalk
In Smalltalk, symbols can be created with a literal form, or by converting a string. They can be used as an identifier or an interned string. Two symbols with the same contents will always refer to the same object.[13] In most Smalltalk implementations, selectors (method names) are implemented as symbols.
Examples
The following is a simple example of a symbol literal in 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 can be coerced into symbols, vice versa:
my_symbol := 'Hello, world!' asSymbol " => #'Hello, world!' "
my_string := #hello: asString " => 'hello:' "
Symbols conform to the symbol
protocol, and their class is called Symbol
in most implementations:
my_symbol := #hello_world
my_symbol class " => Symbol "
Symbols are commonly used to dynamically send messages to (call methods on) objects:
" same as 'foo' at: 2 "
'foo' perform: #at: with: 2 " => $o "
References
- Hunt, Dave Thomas ; Chad Fowler ; Andy (2001). Programming Ruby the pragmatic programmers' guide ; [includes Ruby 1.8] (2. ed., 10. print. ed.). Raleigh, NC: The Pragmatic Bookshelf. ISBN 978-0-9745140-5-5.
- Symbols on the page on Data Structures
- Keywords on the page on Data Structures
- "A tour of the Dart language | Symbols". Dart programming language. Retrieved 17 January 2021.
- Common Lisp HyperSpec, system class Symbol
- Common Lisp HyperSpec, system class Package
- Peter Norvig: Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp, Morgan Kaufmann, 1991, ISBN 1-55860-191-0, Web
- Bratko, Ivan (2001). Prolog programming for artificial intelligence. Harlow, England ; New York: Addison Wesley. ISBN 978-0-201-40375-6.
- Kidd, Eric. "13 Ways of Looking at a Ruby Symbol". Random Hacks. Retrieved 10 July 2011.
- "Programming Ruby: The Pragmatic Programmer's Guide".
- "Using Symbols for the Wrong Reason". Gnomic Notes.
- "Symbol". Ruby Documentation. Retrieved 10 July 2011.
- http://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf ANSI Smalltalk standard.