2008/12/31

【scheme】アキュムレータ、局所変数、破壊的代入

ハッカーと画家 コンピュータ時代の創造者たち 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
変数も代入もまだSICPに出てこない。 SICPってSchemeの入門書ではなくてプログラミングとかコンピュータ科学とかの入門書のはずだよな。一般的には変数とか代入が最初に解説してありそうなもんだけどねw変数や代入より関数定義、再帰、レキシカルスコープが先に出てくるんだもんなーw

0 件のコメント:

コメントを投稿