5

まず第一に、私が理解しているように、変数識別子はCommonLispではシンボルと呼ばれています。

C変数識別子のような言語では、英数字とアンダースコアしか使用できませんが、Common Lispでは、「*」や(少なくともスキームでは)「?」のようにさらに多くの文字を使用できます。

だから、私が知りたいのは、Common Lispがシンボル(または私が間違っている場合は変数識別子)に含めることができる文字の完全なセットは正確には何ですか?それはSchemeでも同じですか?

また、関数名の文字セットは異なりますか?

私はグーグルをして、CLHSとPractical Common Lispを調べてきましたが、私の人生では、答えが見つからないように見えるので、何かが間違っているに違いありません。

4

3 に答える 3

8

詳細な答えは少し注意が必要です。CommonLispにはANSI規格があります。使用可能な文字のセットを定義します。基本的に、これらの定義されたすべての文字をシンボルに使用できます。トークンとしてのシンボルも参照してください。

例えば

|Polynom 2 * x ** 3 - 5 * x ** 2 + 10|

は有効なシンボルです。縦棒はシンボルをマークし、シンボル名に属していないことに注意してください。

次に、Common Lispの既存の実装と、さまざまな文字セットおよび文字列型のサポートがあります。そのため、いくつかはUnicode(または同様のもの)をサポートし、シンボル名にUnicode文字を使用できます。

LispWorks:

CL-USER 1 > (list 'δ 'ψ 'σ)
(δ ψ σ)
于 2012-07-27T07:52:34.963 に答える
5

[Schemerの観点から。SchemeとCommonLispのいくつかの概念は同じ名前ですが、それは2つの言語で同じことを意味するという意味ではありません。]

まず、シンボルと識別子は2つの異なるものであることに注意してください。

シンボルは、高速の等式比較をサポートする文字列と考えることができます。2つの記号はst同じスペルの場合は(多かれ少なかれ)等しいです。操作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

于 2012-07-27T08:25:52.280 に答える
2

リーダーアルゴリズムの詳細については、CLHSの第2章を参照してください。しかし、簡単な答えは、トークンがreadmacro呼び出し(セクション2.4)でなく、数字またはすべてのドットではない場合、デフォルトでシンボルとして解釈されるということです。

于 2012-07-27T08:06:05.487 に答える