質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
LISP

LISPはプログラミング言語の一種であり、関数型言語に分類されています。 特徴として、括弧を多様する独特の構文を持ちます。

Q&A

解決済

1回答

1228閲覧

lispにおける評価とは

mightyMask

総合スコア143

LISP

LISPはプログラミング言語の一種であり、関数型言語に分類されています。 特徴として、括弧を多様する独特の構文を持ちます。

1グッド

1クリップ

投稿2018/11/13 10:07

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をそれぞれ評価し12に、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です。

なぜこのような結果になるのでしょうか?

tf2014👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

S式に置き換えて

という部分が違っていると思います。

②では、引数である'1'2をそれぞれ評価し12に、仮引数のx1y2をバインドして、(+ x y)を評価すると、関数呼び出しなので、引数のxを評価して1に、yも同じく。で、関数+の中で12が足されて3になります。関数+3を返し、その値をそのまま関数sumが返す。

2つ目の例だと、引数である''1を評価し'1になり、仮引数のx'1をバインドして、xを評価すると'1です。

投稿2018/11/13 11:43

otn

総合スコア84540

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問