Что делает действие этой программы lwp разным между прямой загрузкой в строке комментария и использованием процедуры загрузки?
Я использую guile 2.0.13
как мой интерпретатор схемы, и я написал файл 3.3.3.scm
следующим образом:
(define lwp-list '())
(define quit-k #f)
(define lwp
(lambda (thunk)
(set! lwp-list (append lwp-list (list thunk)))))
(define start
(lambda ()
(if (not quit-k)
(set! quit-k (call/cc (lambda (k) k))))
(if (not (null? lwp-list))
(let ([p (car lwp-list)])
(set! lwp-list (cdr lwp-list))
(p)))))
(define pause
(lambda ()
(call/cc
(lambda (k)
(lwp (lambda () (k #f)))
(start)))))
(define quit
(lambda ()
(set! lwp-list '())
(quit-k #f)))
(lwp (lambda () (let f () (pause) (display "h") (f))))
(lwp (lambda () (let f () (pause) (display "e") (f))))
(lwp (lambda () (let f () (pause) (display "y") (f))))
(lwp (lambda () (let f () (pause) (display "!") (f))))
(lwp (lambda () (let f () (pause) (newline) (f))))
(lwp (lambda () (let f () (pause) (quit))))
(start)
Кажется, что 3.3.3.scm
работает хорошо, если я использую (load "3.3.3.scm")
в интерактивном интерфейсе. Но когда я бегу прямо guile 3.3.3.scm
, процедура quit
будет вызван после guile
назвал это в первый раз:
hey!
Backtrace:
In ice-9/boot-9.scm:
160: 3 [catch #t #<catch-closure 17db460> ...]
In unknown file:
?: 2 [apply-smob/1 #<catch-closure 17db460>]
In ice-9/boot-9.scm:
66: 1 [call-with-prompt prompt0 ...]
In unknown file:
?: 0 [#f #f]
ERROR: In procedure #f:
ERROR: Wrong type to apply: #f
В каком случае это отличие?