SICP 演算子に合成式

elispでSICP

SICPの問題1.5は演算子を合成式にできることを確かめましょうという問題なのだけど、elispだとどうもうまくいかない。

結局演算子をクォートして、consでリストにして作ったリストをevalで評価するようにしてみた。

defun a-plus-abs-b (a b)
 (eval (cons (if (> b 0) '+ '-) '(a b))))
a-plus-abs-b

(a-plus-abs-b 10 5)
15

(a-plus-abs-b 10 -5)
15

でもこれだと演算子を合成式にできるっていうイメージとまるでかけ離れてるなぁ

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン
ピアソンエデュケーション / 4830円 ( 2000-02 )


Gaucheもやっぱインストールしておくべきだろうか?

elispでSICP

ここのところちょっとやる気が出ないので、違うことをして気分転換してみている。

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン
ピアソンエデュケーション / 4830円 ( 2000-02 )


本のサンプルはSchemeだけど、これをelisp(Meadow)で解いていくことにした(たまにHaskellでも解いてみたいが)。

1.3 3つの数を引数としてとり、大きい2つの数の二乗の和

(defun sq (a b c) (+ (if (> a b) (* a a) (* b b)) 
                     (if (> b c) (* b b) (* c c))))

(sq 4 2 3)
25

(sq -1 -2 -3)
5

elispだとdefun,setqと分けるけど、Schemeだとどちらもdefineという同じ構文を使う。