SICP Lite #2

いや〜、参加者のみなさん、お疲れさまでした。
今日は、学生の方が参加されてたり、前回と違う感じで、また面白かったです。

個人的に引っかかったところを列挙しておきます。

束縛と言う言葉の意味

束縛と言われると、もう2度と変更できない、イメージを持ってしまうのですが、Schemeの場合、単純に変数がどのオブジェクトを指しているか、と言う意味合いじゃないでしょうか? 何か実体を指していると、『その変数は何かを束縛している』となるし、何も指していないとすると、『Freeである』と言うことかな?

ちなみに、まだ先の話になりますが、3章に変数の参照先を変える方法として、set!が出てきます。このset!とdefineて何が違うんだろう? p.140によると、『変数が環境で未束縛なら、set!はエラーとなる』らしいが、参照先を変える、と言う意味では、defineもset!も同じ?

Lexical ScopeとDynamic Scopeの違い

正直、全く理解してない。On Lispの本に違いが書いてあったような気がするので、今度見てみます。

反復プロセスと再帰プロセスのぱっと見で見分ける方法

hayatoさんが面白いことを言ってたなぁ。再帰呼び出しをしているS式の構造が、define文の第1引数の形と同じであれば反復。そうでなければ、再帰。
階乗の例。まずは、再帰。

(define (factorial n)    ; <= ここと
  (if (= n 1)
    1
    (* n (factorial (- n 1)))))   ; <= ここ

この場合、else-clauseの式の引数の一つとして、再帰呼び出しになっているので、これは再帰プロセス。

次は反復の例。

(define (factorial n)
  (define (iter product counter max-count)    ; <= ここと
    (if (> counter max-count)
      product
      (iter (* counter product)    ; <= ここの文
            (+ counter 1)
            max-count)))
  (iter 1 1 n))

この場合、else-clauseの式自体が再帰呼び出しになっている。

今まで、曖昧だったのだけど、これが末尾再帰と言われる所以なのか。