SE Can't Code

A Tokyo based Software Engineer. Not System Engineer :(

SICP一章、終了した。

SICPの一章である、「手続きによる抽象の構築」の問題を解き終わった。問題以外は過去に既に一読しているのでサクサク進むかと思いきや、なかなか手こずった。再帰プロセスはサクッと理解して書けるのだが、反復プロセスに慣れるのに時間がかかった感じ。解いた問題はTILに置いてある。(全部はpush出来てないけど)

github.com

再帰プロセスの場合はベースモデルに行き着くまで、パラメータを更新しながら処理をスタックして深く潜っていくイメージで、反復プロセスは下から順に成果を積み上げていって、次の処理に成果を渡すイメージ。考え方自体はすぐ納得するんだけど、実装に落とすところで慣れるのに時間がかかった。特に高階手続きが入ったあたりの反復プロセスはなかなかイメージがしづらく苦労した。

またlambdaの説明もあった。個人的にPythonでよくlambdaは使うので、無名関数の使い勝手はわかっていたが、最初は引数の渡し方が構造上あまり腑に落ちなかった。

(define (f x y)
  ((lambda (a b)
     (+ (* x (square a))
        (* y b)
        (* a b)))
   (+ 1 (* x y))
   (- 1 y)))

まぁそういうものだと一度飲み込むとすぐに書けるようになるんだけど、むしろlambdaのシンタックスシュガーであるletの方が腑に落ちる。letで気を付けるところとしては、束縛変数の部分だろうか。

(define x 5)
(+ (let ((x 3))
     (+ x (* x 10)))
   x)

>> 38

とはいえここもきちんと変数のスコープを意識してれば問題ないと思う。


一度SICPを一周した時は問題をスキップしてたんだけど、解かないとちゃんと理解出来ないんだなと改めて思った(当たり前)。しかしSICP、数学の問題が多くを占めているのでそこでうげぇとなる。ノートにガリガリ数学解いてから、Scheme書いて、コンパイルエラー出て泣きながら式を見直す、というのを繰り返している。正直、SICPだけで数時間は取られてるので、他の勉強の放置感がある。やっぱネックは数学で(機械学習統計学でも)、最近コードを書く時間より数学解いてる時間の方が長い気がしてならない。これが学生時代のツケか。

そんなこんなで泣きながら二章に突入した。データ構造の抽象化は面白いので笑いながらやっていきたい。

Remove all ads