新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

SICP 勉強会

社内で SICP の勉強会をした。まず、、関数型プログラムというのがどうもとっつきにくいということがわかった。私の場合、学生(1980 年代だ、、、)のときにちょっとやったのと就職してから(1988)も Emacs-lisp をちょっと独学したので苦にならない。cond がつかえれば、、、
lisp の基本をざっくり飛ばして図形言語にいきたかったのだが、まず問題 1.3 でつまずいた。reverse をつくるなんて例題でもつまずいた。on Lisp の group にはいつたどり着くんだ?

これは先が長い!!!

プログラマの教養として Lisp は必要だなと痛感した。参考までに書くと問題1.3 はこんな感じ。

(define f1 (lambda (a b c)
        (if (< a b) (f1 b a c)
                (if (>= b c) (g a b) (g a c)))))

g が実際の計算関数。本質ではないのでここではオミット。3行で書ける。比較は2回しかしない。これを C 風に書くと

retry:
    if ( a < b ) {
        tmp = a;
        a = b;
        b = tmp;
        goto retry;
    }

    if (b >= c) {
        return g(a, b);
    } else {
        return g(a, c);
    } 

g が二回でてくるのがスマートじゃない。

(g a (if (>= b c) b c))

としたほうが g が1回しか出てこなくてスマートかな?複雑?

http://tech.sinby.com/ja/tech/sicp/read-sicp/ex-1.3