コンピュータプログラミングにおけるシンボルは、インスタンスが人間が読める形式を持つプリミティブなデータ型です。シンボルは識別子として使用できます。一部のプログラミング言語では、シンボルはアトムと呼ばれます。[ 1 ]シンボルテーブルにシンボルを保持することで一意性が保証されます。プログラマによるシンボルの最も一般的な使用法は、言語のリフレクション(特にコールバック)を実行することであり、間接的に最も一般的な使用法は、オブジェクトリンクを作成することです。
以下のプログラミング言語は、シンボルの実行時サポートを提供します。
Juliaのシンボルは、解析された Julia コード ( AST ) 内の識別子を表すために使用されるインターン化された文字列であり、エンティティを識別するための名前またはラベル (たとえば、辞書のキーとして) として使用されます。[ 5 ]
Lispのシンボルは、名前空間( Common Lispではパッケージ)内で一意です。シンボルは、関数 EQ を使用して等価性をテストできます。Lisp プログラムは、実行時に新しいシンボルを生成できます。Lisp がテキストで表現されたシンボルを含むデータを読み込む場合、既存のシンボルが参照されます。シンボルが不明な場合は、Lisp リーダーが新しいシンボルを作成します。
Common Lispでは、シンボルには名前、値、関数、プロパティのリスト、パッケージという属性があります。[ 6 ]
Common Lispでは、シンボルがパッケージ内にインターン化されない場合もあります。そのようなシンボルは出力できますが、読み戻す際には新しいシンボルを作成する必要があります。インターン化されていないため、元のシンボルをパッケージから取得することはできません。
Common Lisp では、シンボルにはスペースや改行などの空白文字を含む任意の文字を使用できます。シンボルに空白文字が含まれている場合は、 と記述する必要があります|this is a symbol|。シンボルは、変数、関数、マクロ、クラス、型、goto タグなど、あらゆる種類の名前付きプログラミング構造の識別子として使用できます。シンボルはパッケージにインターンできます。[ 7 ]キーワードシンボルは自己評価され、[ 8 ] KEYWORD という名前のパッケージにインターンされます。
以下は、Common Lispシンボルの簡単な外部表現です。
これはシンボルです記号には空白文字(およびその他のすべての文字)を含めることができます。
|これは空白を含む記号です|Common Lispでは、印刷表現の先頭にコロンが付いているシンボルはキーワードシンボルです。これらはキーワードパッケージに格納されます。
:キーワード記号シンボルの印刷表示には、パッケージ名が含まれる場合があります。パッケージ名とシンボル名の間には、コロンを2つ記述します。
パッケージ名::シンボル名パッケージはシンボルをエクスポートできます。その場合、パッケージ名とシンボル名の間にコロンを1つだけ記述します。
パッケージ:エクスポートシンボルパッケージにインターン化されていないシンボルも作成でき、表記法を持つことができます。
#:未収容シンボルPostScriptでは、名前オブジェクトへの参照はリテラルまたは実行可能のいずれかであり、これらによってインタープリタの動作が変わります。演算子cvxとcvl演算子を使用して、2つの形式を変換できます。演算子を使用して文字列から名前を構築する場合cvn、使用できる文字セットに制限はありません。
Prologでは、記号 (またはアトム) が数値と同様に主要な基本データ型です。[ 9 ]正確な表記は Prolog の方言によって異なる場合がありますが、常に非常にシンプルです (引用符や特別な先頭文字は必要ありません)。
他の多くの言語とは異なり、 Prologでは、いくつかの事実や規則を作成することで、記号に意味を与えることが可能です。
以下の例は、2つの事実(父親とは何かを説明する)と1つの規則(兄弟姉妹の意味を説明する)を示しています。これらの3つの文では、記号(父親、ゼウス、ヘルメス、ペルセウス、兄弟姉妹)といくつかの抽象変数(X、Y、Z)が使用されています。分かりやすさのために、母親との関係は省略されています。
父(ゼウス、ヘルメス)。父(ゼウス、ペルセウス)。兄弟(X 、Y ):父(Z 、X )、父(Z 、Y )。Rubyでは、シンボルはリテラル形式で作成することも、文字列を変換して作成することもできます。[ 1 ] シンボルは識別子またはインターン文字列として使用できます。[ 10 ]同じ内容の 2 つのシンボルは常に同じオブジェクトを参照します。[ 11 ] Ruby では、シンボルを連想配列のキーとして使用するのがベストプラクティス とされています。 [ 10 ] [ 12 ]
以下は、Ruby のシンボルリテラルの簡単な例です。[ 1 ]
my_symbol = :a my_symbol = :"識別子"文字列は記号に変換でき、その逆も可能です。
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"SymbolシンボルはRuby のクラスのオブジェクトです: [ 13 ]
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シンボルは、オブジェクトに動的にメッセージを送信したり(オブジェクトのメソッドを呼び出したり)するためによく使用されます。
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 : "apple" , b : "banana" } => {:a=>"apple", :b=>"banana"} irb(main):010:0> my_hash [ :a ] => "apple" irb(main):011:0> my_hash [ :b ] => "banana"Smalltalkでは、シンボルはリテラル形式で作成することも、文字列を変換して作成することもできます。シンボルは識別子またはインターン文字列として使用できます。同じ内容の 2 つのシンボルは常に同じオブジェクトを参照します。[ 14 ]ほとんどの Smalltalk 実装では、セレクタ (メソッド名) はシンボルとして実装されています。
以下は、Smalltalkにおけるシンボルリテラルの簡単な例です。
my_symbol := # '識別子' " シンボルリテラル " my_symbol := #a " 技術的には、これはセレクタリテラルです。ほとんどの実装では、 " " セレクタはシンボルなので、これもシンボルリテラルです "文字列は記号に変換でき、その逆も可能です。
my_symbol := 'Hello, world!' asSymbol " => #'Hello, world!' " my_string := #hello: asString " => 'hello:' "シンボルはプロトコルに準拠しておりsymbol、Symbolほとんどの実装ではそのクラスは次のように呼ばれます。
my_symbol := #hello_world my_symbolクラス" => Symbol "シンボルは、オブジェクトに動的にメッセージを送信したり(オブジェクトのメソッドを呼び出したり)するためによく使用されます。
" 'foo' と同じ at: 2 " 'foo'実行: #at: with: 2 " => $o "