コンピュータプログラミングにおけるシンボルは、インスタンスが人間が読める形式であるプリミティブデータ型です。シンボルは識別子として使用できます。一部のプログラミング言語では、シンボルはアトムと呼ばれます。[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 では、先頭にコロンがあるシンボルは、印刷された表現でキーワード シンボルと呼ばれます。これらは、キーワード パッケージにインターン化されます。
:キーワードシンボル
シンボルの印刷表現にはパッケージ名が含まれる場合があります。パッケージ名とシンボル名の間には 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"
シンボルはSymbolRubyのクラスのオブジェクトである: [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 クラス " => シンボル "
シンボルは、オブジェクトにメッセージを動的に送信する(オブジェクト上のメソッドを呼び出す)ためによく使用されます。
" 'foo' と同じ at: 2 "
'foo' perform: #at: with: 2 " => $o "
参考文献
- ^ abc Thomas, Dave ; Fowler, Chad; Hunt, Andy (2001). Programming Ruby the pragmatic programmingers' guide; [Ruby 1.8 を含む] (第 2 版、第 10 刷)。ノースカロライナ州ローリー: The Pragmatic Bookshelf。ISBN 978-0-9745140-5-5。
- ^ データ構造のページ上のシンボル
- ^ データ構造のページのキーワード
- ^ 「Dart言語のツアー | シンボル」。Dartプログラミング言語。 2021年1月17日閲覧。
- ^ 「Julia Core.Symbol」。Juliaドキュメント。2022年5 月 31 日閲覧。
- ^ 「CLHS: システムクラス SYMBOL」。www.lispworks.com。
- ^ 「CLHS: システムクラスパッケージ」www.lispworks.com。
- ^ Peter Norvig :人工知能プログラミングのパラダイム: Common Lisp のケーススタディ、Morgan Kaufmann、1991 年、ISBN 1-55860-191-0、Web
- ^ Bratko, Ivan (2001).人工知能のための Prolog プログラミング. イギリス、ハーロー、ニューヨーク: Addison Wesley. ISBN 978-0-201-40375-6。
- ^ ab Kidd, Eric (2007 年 1 月 20 日). 「Ruby シンボルを見る 13 の方法」. Random Hacks . 2011 年7 月 10 日閲覧。
- ^ 「プログラミング Ruby: 実用的なプログラマー向けガイド」. ruby-doc.com .
- ^ 「間違った理由でシンボルを使用する」Gnomic Notes。
- ^ 「Symbol」。Rubyドキュメント。2011年7 月 10 日閲覧。
- ^ http://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf ANSI Smalltalk 標準。
