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の式自体が再帰呼び出しになっている。
今まで、曖昧だったのだけど、これが末尾再帰と言われる所以なのか。