継続苦戦中,いわんや非継続.

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.

うーん,どんなんでしょう,これって.
いや,私は,最初,原書の方をしらなくて,再帰を使うんだとばかり思っていたので(苦笑