私はLispが初めてです。「リスト」と「S 式」という 2 つの用語に遭遇しました。私はそれらを区別することはできません。それらは Lisp の単なるシノニムですか?
5 に答える
まず、すべての S 式がリストを表すわけではありません。foobar
裸のアトムを表すなどの式も S 式と見なされます。「コンス セル」構文と(car . cons)
同様に、「コンス」部分自体が別のリスト (または nil) ではない場合に使用されます。などのより馴染みのあるリスト式は(a b c d)
、入れ子になったコンス セルのチェーンの単なる構文糖衣です。その例は に展開され(a . (b . (c . (d . nil))))
ます。
次に、「S 式」という用語は、構文-を指します(items like this (possibly nested))
。このような S 式はリストの Lisp ソース コードでの表現ですが、技術的にはリスト自体ではありません。この区別は、10 進数のシーケンスとその数値の間、または引用符内の文字のシーケンスと結果の文字列の間の区別と同じです。
これはおそらく、過度に技術的な区別です。プログラマーは、値そのものであるかのように、値のリテラル表現を日常的に参照します。しかし、Lisp とリストでは、Lisp プログラム内のすべてが技術的にリストであるため、少し複雑になります。
たとえば、次の式を考えてみましょう。
(+ 1 2)
+
上記は、アトム、1
、およびで構成されるフラット リストを表す単純な S 式2
です。
ただし、Lisp プログラム内では、このようなリストは、+
引数として 1 と 2 を持つ関数の呼び出しとして解釈されます。(そのように解釈されるのはS-expressionではなく、listであることに注意してください。評価者は、ソース コード テキストではなく、リーダーによって事前に解析されたリストを受け取ります。)
したがって、上記の S 式はリストを表していますが、Lisp プログラムのコンテキストで「リスト」と呼ばれることはめったにありません。マクロやリーダーの内部動作について議論したり、他のコード生成や構文解析のコンテキストのためにメタ構文の議論に従事したりしない限り、典型的な Lisp プログラマーは代わりに上記を数値式として扱います。
一方、次の S 式のいずれも「リスト」と呼ばれる可能性があります。これは、それらを Lisp コードとして評価すると、上記のリテラル S 式で表されるリストがランタイム値として生成されるためです。
'(+ 1 2)
(quote (+ 1 2))
(list '+ 1 2)
もちろん、コードとデータの同等性は Lisp の優れた点の 1 つであり、その区別は流動的です。しかし、私が言いたいのは、上記のすべては S 式とリストですが、カジュアルな Lisp 用語で「リスト」と呼ばれるのは一部だけだということです。
S式はデータの表記です。
歴史的に、s式(シンボリック式の略)は次のように記述されます。
- のよう
FOO
な記号BAR
- 1番目と2番目の要素としてS式を使用するconsセル:
(
expression-1.
expression-2)
- リスト終了記号
NIL
- そしてリストを書くための慣習:リスト
(
A
.
(
B
.
NIL
)
)
として書かれる方が簡単です(A B)
また、歴史的にプログラムテキストは異なって書かれていたことにも注意してください。関数の例ASSOC
。
assoc[x;y] =
eq[caar[y];x] -> cadar[y];
T -> assoc[x;cdr[y]]
歴史的に、これらのm式(メタ式の略)からS式へのマッピングも存在していました。今日、ほとんどのLispプログラムコードはS式を使用して書かれています。
これはここで説明されています:マッカーシー、シンボリック式の再帰関数
Common LispのようなLispプログラミング言語では、最近のS式はより多くの構文を持ち、より多くのデータ型をエンコードできます。
- 記号:
symbol123
、|This is a symbol with spaces|
- 番号:
123
、、、、..。1.0
1/3
- 文字列:
"This is a string"
- 文字:
#\a
、#\space
- ベクトル:
#(a b c)
- 結論とリスト:
( a . b )
、(a b c)
- コメント:
; this is a comment
、#| this is a comment |#
もっと。
リスト
リストはデータ構造です。これは、短所セルとリスト終了マーカーで構成されます。リストには、LispでS式のリストとしての表記があります。リストには他の表記法を使用することもできますが、Lispではs式構文を使用してリストを記述しています。
補足:プログラムとフォーム
Common Lispのようなプログラミング言語では、プログラミング言語の表現はテキストではなくデータです。これは、他の多くのプログラミング言語とは異なります。プログラミング言語CommonLispの式はと呼ばれLisp forms
ます。
たとえば、関数呼び出しはLispデータであり、呼び出しは最初の要素として関数シンボルを含むリストであり、次の要素はその引数です。
それをと書くことができます(sin 3.0)
。しかし、それは本当にデータです。構築できるデータ。
Lispフォームを評価する関数が呼び出されEVAL
、プログラムテキストやプログラムテキストの文字列ではなく、Lispデータを受け取ります。(EVAL (LIST 'SIN 3.0))
したがって、 Lispデータを返すLisp関数を使用してプログラムを構築できます0.14112
。
Lispフォームにはデータ表現があるので、それらは通常Lispの外部データ表現を使用して書かれています-これは何ですか?--s式!
S式です。LispデータとしてのLispフォームはS式として外部に書き込まれます。
最初に主なLisp機能を理解する必要があります-プログラムはデータとして操作できます。{
特別な構文( 、、、、など)を使用してプログラムを作成する他の言語(CやJavaなど)とは異なり}
、Lispではコードを(ネストされた)リストとして作成します(ところで、これにより抽象的な構文ツリーを直接表現できます)。繰り返しになりますが、言語のデータ構造と同じように見えるプログラムを作成します。class
define
データとして話すときは「リスト」と呼びますが、プログラムコードについて話すときは「s-expression」という用語を使用する方がよいでしょう。したがって、技術的には類似していますが、異なるコンテキストで使用されます。これらの用語が混在する唯一の実際の場所は、メタプログラミング(通常はマクロを使用)です。
また、s-expressionは、アトム(数値、文字列など)のみで構成されている場合もあることに注意してください。
どちらも同じように書かれています: (何とか何とか何とか)、入れ子にすることができます。1 つの違いがあります。リストの前にはアポストロフィが付きます。
評価について:
- S式は何らかの結果を返します(アトム、リスト、nilなどの可能性があります)
- リストはリストを返します
必要に応じて、リストを s-exp に、またはその逆に変換できます。
- (eval '(blah blah blah)) => list は s-exp として扱われ、結果が返されます。
- (quote (blah blah blah)) => sexp はリストに変換され、リストは評価せずに返されます
IAS:
- List がデータとして扱われる場合は List と呼ばれ、コードとして扱われる場合は s-exp と呼ばれます。