Hatena::Groupsicp

SICP学習ノート@inoshirou

2010-02-21

今日のSICP

17:43

1.1.4

手続き定義(procedure definitions)

  • 名前と値を対応付けるよりさらに強力な抽象化技法。
gosh> (define (square x) (* x x))
square
gosh> (square 12)
144
gosh> (define (sum-of-squares x y)
(+ (square x) (square y)))
sum-of-squares
gosh> (sum-of-squares 3 8)
73
gosh> square
#<closure square>
gosh> sum-of-squares
#<closure sum-of-squares>

作成された合成手続き(compound procedure)自身を評価すると、closureというものであるらしい。

仮パラメタの数を1以上の任意の数を取れるようにするにはどうしたらいいんだろう?


1.1.5

作用的順序の評価(applicative-order evaluation)

  • 解釈系が実際に使っている方法
  • 引数を評価し、作用させる

正規順序の評価(normal-order evaluation)

  • 完全に展開してから計算する
  • 同じ演算子が複数用いられていると、多重評価により非効率的となる場合がある

1.1.6

場合分け(case analysis)を行うための特殊形式として cond がある。

他の言語では%が余剰を計算する演算子であることが多いがGaucheはそうでは無かった。

ちょうど良いのでcondを使ってこれを定義してみた。

gosh> (define (% x y)
        (cond ((< x y) x)
              ((= x y) 0)
              ((> x y) (% (- x y) y))))
%
gosh> (% 10 3)
1
gosh> (% 7 4)
3

再帰使って書いてみたが、これはダメだ。最終的に答えは出るけど、xとyの比率によって計算量が変わる…。

gosh> (/ 10 3)
10/3

割り切れない場合は小数を返してくれないのが悩みどころ。そういう言語は使ったこと無かったなあ。

小数を返してくれれば小数点以下切り捨てて使えるんだけどなあ。Gaucheリファレンスとか読まないとダメかな。

gauche-readline入れた

10:10

shellの挙動に近いのは安心するかも、とか思ったので。

軽くインストール手順 (debian)

sudo aptitude install gauche-dev libreadline-dev
# tarballダウンロード~解凍迄は省略
./configure
make
sudo make install
gosh -I. gosh-rl.scm  # 動作確認

gaucheとlibreadlineは元から入れていた or 入ってた。

installまでしてしまえば gauche-rl コマンドでもok。