お手元マルチスレッド

Scheme:使いたい人のための継続入門から。ちょっと整理しながら自分メモ。

読み込み

提示されているのは以下のサンプル

(define k #f)  ;; 継続保存用

(let ((in (open-input-file "sample.txt")))
  (read-line (call/cc (lambda (cont)
                        (set! k cont)
                        in))))

この let が何を戻すか。

(lambda (a)
  (PRINT-AND-NEXT-REPL
   (#<subr read-line> a)))

これは分かる。この継続は k にセットされていますが、in 以外のポートだと動作は微妙なのか。具体的にどうなるのか、を試してみる。

gosh> (define k #f)
k
gosh> (let ((in (open-input-file "2.3.2.scm")))
(read-line (call/cc (lambda (cont) (set! k cont) in))))
"(define (deriv exp var)"
gosh> (k in)
*** ERROR: unbound variable: in
Stack Trace:
_______________________________________
gosh> 

駄目ぢゃん。作戦変更。

gosh> (define k #f)
k
gosh> (define in (open-input-file "2.3.2.scm"))
in
gosh> (read-line (call/cc (lambda (cont) (set! k cont) in)))
"(define (deriv exp var)"
gosh> (k in)
" (cond ((number? exp) 0)"
gosh> (+ 1 2 3 4 5)
15
gosh> (k in)
"       ((variable? exp)"
gosh> 

やはり最初の一発目は読むのか。次は入力ふたつに出力ふたつのセット。これも let 使ってるようですがどうなんだろ。自分用にちょっと修正

(define buf "")
(define kin #f)
(define kout #f)
(define inp #f)
(define in2 (open-input-file "ch5-syntax.scm"))
(define outp #f)
(define out2 (open-output-file "sample-out2.txt"))
(let* ((in (open-input-file "factorial.scm"))
       (line (read-line (call/cc (lambda (cont)
                                   (set! inp in)
                                   (set! kin cont)
                                   in)))))
  (set! buf (string-append buf "\n" line)))
(let ((out (call/cc (lambda (cont)
                      (let ((out (open-output-file "sample-out.txt")))
                        (set! outp out)
                        (set! kout cont)
                        out)))))
  (display buf out)
  (flush out)
  (set! buf "")
  (display "write and buf clear."))

で REPL に流しこんでナニ

gosh> (kin inp)
"\n(load \"load-eceval-compiler\")"
gosh> (kin inp)
"\n(load \"load-eceval-compiler\")\n(load \"ch5-compiler\")"
gosh> (kin inp)
"\n(load \"load-eceval-compiler\")\n(load \"ch5-compiler\")\n(define true #t)"
gosh> 

を。追加していくのか。

gosh> (kin in2)
"\n(load \"load-eceval-compiler\")\n(load \"ch5-compiler\")\n(define true #t)\n;;;;SCHEME SYNTAX FROM SECTION 4.1.2 OF STRUCTURE AND INTERPRETATION OF"
gosh>

なるほど。これは確かにマージできるな。面白い。次の部分継続もエントリを分けて投入予定ッス。