1

Recently, I was reading article "Root Of Lisp" from Paul Graham.I encountered some questions.From the book, it defines expression as two :1.atom;2.list, while list is consisted of zero or many expressions.Then it sayes that a list can be evaluated.Now I hava some problems:

  1. Can every list be evaluated?Is every list an expression?
  2. If a list can be evaluated, then it may have its first element as an operator,so an operator is an expression?Is operator atomic or another?
  3. The operator car returns the first element of a list, if the list can be evaluated, then what will it return , the operator?Can you give me some sample of this to show how to use the returned value?
  4. The operator cdr returns elements besides the first element as a list,then this returned list can't be evaluated?

I am a freshman for Lisp,I don't know whether I hava explained my problems clearly.

4

1 に答える 1

2

Lisp の S 式 (sexp) は、アトムか、sexp のリストです。

1

すべての Lisp 形式 (つまり、評価できるもの) は S式ですが、すべての S式 が Lisp 形式というわけではありません。

より具体的には、Lispフォームは任意のアトム、または最初の要素がシンボルであるリストです。

(foo 42)       ; valid Lisp form
(undefined 42) ; Lisp form, but invalid because of undefined function
(42 foo)       ; not a Lisp form - numbers aren't symbols

2

先ほど述べたように、Lisp 形式のリストの「演算子」(最初の要素) はシンボルでなければなりません。(Lisp-1 (たとえば、Scheme) では、任意の Lisp フォームを演算子の位置に置くことができますが、Roots of Lisp では、元の (a Lisp-2) と Common Lisp (a Lisp-2) について説明しています。それらは、演算子の位置をシンボルに制限しています。 .)

3

コンパイル前の Lisp コードは Lisp データです。それは重要です。

と言ったら(car 'foo)、プログラムは文句を言います。fooリストではないので、当然のことです。

私が言った場合(car '(car 'foo))、内部リストは評価され(古き良き引用構文')、car演算子の位置にあるもの (この場合はシンボル) を抽出しますcar。これは、マクロを定義するときに役立ちます。

4

依存します。

まず、foo2 つの引数の関数としてbar定義し、変数と 1 つの引数の関数の両方として定義したとします。また、ボンネットの下では、Lisp はおそらくあなたが入力したものを呼び出していることも覚えておいてくださいeval

現在(eval '(foo bar 42))は有効で、foo引数 <the value of bar> およびで呼び出します42(eval (cdr '(foo bar 42)))も完全に有効です。これは、引数(eval '(bar 42))で呼び出すと同等です。bar42

barが関数として定義されていない場合cdrでも、2 番目の例の は有効な Lisp フォームを生成し(bar 42)ますが、関数を呼び出すbar(存在しない) ため、そのフォームを評価するとエラーになります。

構文セマンティクスについて話すと便利です。構文的には、任意のアトム、または演算子の位置に記号を含む任意のリストが有効です。意味的に (構文の境界内で)、変数定義のないシンボルであるアトムはエラーです。最初の要素が関数定義のないシンボルであるリストも同様です。

この回答がお役に立てば幸いです。

于 2013-04-28T06:26:46.653 に答える