lispの「S式の評価」というものを知りたくて、以下のような実験をしました。
Lisp
1(defun sum (x y) (+ x y)) 2 3(sum 1 2) ; 3 ... ① 4(sum '1 '2) ; 3 ... ② 5(sum ''1 ''2) ; *** +: '1 is not a number ... ③
まず①より、評価結果が(+ 1 2)にならず3になるという事は、sumという関数では(+ 1 2)を作った後、そのS式を評価しているのだろうと分かります。
そして、②と③より、2つの引数を評価した後に(+ 1 2)を作っているのだろうと分かります。
つまり、任意のxとyにおいて、(sum x y)
と(eval (+ (eval x) (eval y)))
は同じ動作をするだろうと予想できるわけです。
評価の回数で言えば、引数の個数+1回となるでしょう。
順番で言えば、引数を全て評価→S式を置き換える→置き換えたS式を評価となります。
②の動作結果を追うと、引数である'1
と'2
をそれぞれ評価し1
と2
に、S式に置き換えて(+ 1 2)に、そして置き換えたS式を評価して3
になったというわけです。
しかし、次の実験で予想と反した結果が起こりました。
lisp
1(defun eval2 (x) x) 2 3(eval2 '1) ; 1 4(eval2 ''1) ; '1
先ほどの実験結果から(eval2 ''1)
を評価したS式を予想すると、1
になるはずなのです。
まず、引数である''1
を評価し'1
になり、その後S式の置き換えを行って'1
になり(ここは変わってないですが)、そして最後に置き換えたS式を評価して1
になる。
はずなのですが、結果は'1
です。
なぜこのような結果になるのでしょうか?

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。