Что делает действие этой программы 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

В каком случае это отличие?

0 ответов

Другие вопросы по тегам