継続苦戦中,いわんや非継続.
non-preemptive な,なんちゃってスレッドの例題を理解するのに苦戦した.
さらに,その後の問題も解けず答えをみました.ちっ.
;; Exercise 3.3.1 ;; ;; Use call/cc to write a program that loops indefinitely, ;; printing a sequence of numbers beginning at zero. Do not use ;; any recursive procedures, and do not use any assignments. (let ((kn (call/cc (lambda (k) (cons k 0))))) ;; この発想はできないぞー!! (let ((k (car kn)) (n (cdr kn))) (write n) (newline) (k (cons k (+ n 1)))))
うまいねぇ.ため息がでてしまうよ.
小学生のとき,IQ テストで,3kg のおにぎりを食べた後,体重計に乗ったら,
どうなるか? という問題で,3kg 増える,という選択肢を選べなかった,
私の低い IQ では到底発想不可能な手法.let 式のバインドする側で継続を生成するのね.
うまいなー.
さて,その次の問題もできず.
;; Exercise 3.3.2 ;; ;; Rewrite product without call/cc, ;; retaining the feature that no multiplications are performed ;; if any of the list elements are zero. (define product (lambda (ls) (cond ((null? ls) 1) ((= (car ls) 0) 0) (else (let ((n (product (cdr ls)))) (if (= n 0) 0 (* n (car ls))))))))
これも,おなじく,let 式のバインドする側で,procedure をよんでいる点に注目ですね.
うーん,素敵.
Web 上にあるのは,第3版であり,原書の第2版がどうなっているかしりません.ですが,
手元にある,訳書から問題3.3.1を引用します.
0 から始まる数字の並びを無限ループで表示するプログラムを call/cc を使って,
かいてください.
これに対応するであろう,Web 上にある,問題3.3.1 は上で引用したように,
Use call/cc to write a program that loops indefinitely,
printing a sequence of numbers beginning at zero. Do not use
any recursive procedures, and do not use any assignments.
うーん,どんなんでしょう,これって.
いや,私は,最初,原書の方をしらなくて,再帰を使うんだとばかり思っていたので(苦笑