お手元マルチスレッド
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>
なるほど。これは確かにマージできるな。面白い。次の部分継続もエントリを分けて投入予定ッス。