[Schemerの観点から。SchemeとCommonLispのいくつかの概念は同じ名前ですが、それは2つの言語で同じことを意味するという意味ではありません。]
まず、シンボルと識別子は2つの異なるものであることに注意してください。
シンボルは、高速の等式比較をサポートする文字列と考えることができます。2つの記号はs
、t
同じスペルの場合は(多かれ少なかれ)等しいです。操作string=?
は、内の文字をループして、それらがすべて類似しているかどうかを確認する必要があります。これには、最短の弦の長さに比例した時間がかかります。一方、シンボルは自動的に(ランタイムシステムでは)(通常は)ハッシュテーブルに入れられます。したがってsymbol=?
、単純なポインタ比較に要約されるため、非常に高速です。シンボルは、Cの1つが列挙を使用する場合によく使用されます。
シンボルは、実行時に存在する可能性のある値です。
識別子は、プログラム内の変数の単なる名前です。
ここで、上記のプログラムをスキーム値として表す場合、1つの選択肢は、シンボルを使用して識別子を表すことです。ただし、これは、シンボルが識別子であることを意味するわけではありません(またはその逆)。識別子のより良い表現(まだSchemeにあります)は、識別子の名前に加えて、識別子が読み取られた(または構築された)場所も記録する構文オブジェクトです。未定義の変数に遭遇し、プログラムのどこに未定義の変数があるかを通知したい場合、ソースの場所が識別子の表現の一部であると非常に便利です。
少なくとも最後のではなく。識別子の合法的な性格は何ですか?ここでは、R6RSの章とバージョンを引用するのが最善です。
4.2.4識別子
他のプログラミング言語で許可されているほとんどの識別子もSchemeで受け入れられます。一般に、文字、数字、および「拡張アルファベット文字」のシーケンスは、数値オブジェクトの表現を開始できない文字で始まる場合の識別子です。さらに、+、-、および...は識別子であり、2文字のシーケンス->で始まる文字、数字、および拡張アルファベット文字のシーケンスも同様です。識別子の例を次に示します。
lambda q soup
list->vector + V17a
<= a34kTMNs ->-
the-word-recursion-has-many-meanings
拡張アルファベット文字は、文字であるかのように識別子内で使用できます。以下は拡張英字です。
! $ % & * + - . / : < = > ? @ ^ _ ~
さらに、Unicodeスカラー値が127より大きく、UnicodeカテゴリがLu、Ll、Lt、Lm、Lo、Mn、Mc、Me、Nd、Nl、No、Pd、Pc、Po、Sc、Sm、Skであるすべての文字、So、またはCoは識別子内で使用できます。さらに、<インライン16進エスケープ>で指定すると、識別子内で任意の文字を使用できます。たとえば、識別子H\x65;llo
は識別子と同じ
Hello
であり、識別子\x3BB;
は識別子と同じ
λ
です。
任意の識別子は、Schemeプログラムで変数または構文キーワード(セクション5.2および9.2を参照)として使用できます。任意の識別子を構文データとして使用することもできます。その場合、識別子は
シンボルを表します(セクション11.10を参照)。
差出人:http ://www.r6rs.org/final/html/r6rs/r6rs-ZH-7.html#node_sec_4.2.4