ハッカーと画家 コンピュータ時代の創造者たち http://stack.nayutaya.jp/book/4274065979 のP.198のアキュムレータを写経したり。
アキュムレータを生成する関数、すなわち、数nを取り、 「数iを取ってnをiだけ増加させ、その増加した値を返す関数」 を返すような関数だ(「増加させる」に注意。ただ足すだけではない。 アキュムレータ(累積機)だから累積させなければ)。
パラメータ:n 戻り値: パラメータ:i 戻り値:nをi増加させて返すを返す
;;=> accumulator (define accumulator (lambda (n) (lambda (i) (set! n (+ n i)) n))) ;; local variable (let ((a (accumulator 0))) (display (a 1))(newline);;=> 1 (display (a 1))(newline);;=> 2 (display (a 3))(newline);;=> 5 (display (a 0))(newline));;=> 5 |
クロージャってことでいいよねコレ。ついでに、局所変数についても調べてみた。(let)
Schemeも破壊的代入を行う手続きが書けるんだね。(set!)
なんか違和感あるなー、なんとなく、代入って。 まぁ話によると、純粋な関数型言語ってHaskellとConcurrentCleanくらいしかないみたいだしね。(純粋関数型言語 = 代入なしってこと?) こういうの(display, newline)が冗長だー。こういうのどう書くかなー。
(let ((a (accumulator 0))) (display (a 1))(newline);;=> 1 (display (a 1))(newline);;=> 2 (display (a 3))(newline);;=> 5 (display (a 0))(newline));;=> 5 |
0 件のコメント:
コメントを投稿