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。

2010-02-20

SICP始める

02:36

環境

デザインは表紙の色にあわせてなんとなく紫系にしてみた。

最初~1.1.3

抽象化

  • 名前と値を関連づけるのも単純な抽象化の一つ

  • 数字は式
  • +とか-とか*とかも式
gosh> +
#<subr +>
gosh> -
#<subr ->
gosh> /
#<subr />
gosh> *
#<subr *>

subrって何?後で調べる。


演算子と被演算子

前置記法

  • 引数を自由にとれる
  • 入れ子構造を許す
gosh> (+ 1 2)
3
gosh> (+ 123 231)
354
gosh> (+ 39 (* 2 4))
47
gosh> (+ 2 2 2)
6
gosh> (+ 349 (+ 92 923) (* 93 99) (- 83 (* 909 890)))
-798356

特殊形式

  • defineを用いると、再利用可能な式を定義できる。これは抽象化だよね。
  • defineは特殊形式(special forms)のひとつ
gosh> (define hoge (* 10 10))
hoge
gosh> hoge
100

メモ

前置記法の長い式書いてそれを自分で計算しようとすると、「値が上方に湧き出す」ように計算しているのに気付く。

シンプルで当たり前の事なんだろうけど実際にやってみると分かりやすい。

「入れ子にする(nested)」で思い出したけど、以前仕事した人でタブでインデントを付けることを「ネストする」って言ってた人がいたなあ。

subr = サブルーチン

Gauche組み込みの手続きがsubrらしい。