3

次の式のうち、正しい Lisp 構文を持っているのはどれ?

(+ 1 (quote 1))
==> 1 (???)
(+ 1 (eval (quote 1))
==> 2

私は現在、独自の Lisp インタープリターを作成していますが、引用符を正しく処理する方法がよくわかりません。私が調べたほとんどの Lisp インタープリターは、両方の式を "2" に評価します。しかし、引用はまったく評価されるべきではないので、2番目のものだけが正当な表現になるのでしょうか? とにかくなぜそれが機能するのですか?これはある種の構文糖ですか?

4

2 に答える 2

5

特別な形式を除いて、ほとんどのLispは最初に引数を評価し、次に関数を適用します(したがって、eval-and-apply句)。

最初のフォーム(+ 1 '1)は、最初にその引数1とを評価します'1。定数の数値はそれ自体に評価され、引用符は引用符に評価されるため、とに適用+したままに1なり1、を生成し2ます。

eval: (+ 1 (quote 1))
eval 1st arg:  1 ==> 1
eval 2nd arg: '1 ==> 1
apply: (+ 1 1) ==> 2

2番目の形式も同様で、引用符で囲まれていない1は一度だけ通過し、再びeval生成されます。1

eval: (+ 1 (eval '1))
eval 1st arg: 1 ==> 1
eval 2nd arg: (eval '1)
  eval arg:    '1 ==> 1
  apply: (eval 1) ==> 1
apply: (+ 1 1) ==> 2
于 2011-09-30T12:02:01.980 に答える
3

数値はそれ自体に評価されるため(quote 1)、と同じ1です。

于 2011-09-30T12:02:57.410 に答える