Есть ли метациркулярный оценщик SICP, который реализует call-with-current-continue?
Источник метациркульного оценщика SICP можно найти по адресу https://mitpress.mit.edu/sites/default/files/sicp/code/ch4-mceval.scm
Кто-нибудь знает о mceval, который включает реализацию call-with-current-continue?
1 ответ
Поскольку это метакруговой оценщик, вы можете реализовать его в терминах .
Просто добавьте следующий код в ch4-mceval.scm.
(define (call/cc? exp) (tagged-list? exp 'call/cc))
(define (call/cc-e exp) (cadr exp))
(define (throw? exp) (tagged-list? exp 'throw))
(define (throw-k exp) (cadr exp))
(define (throw-v exp) (caddr exp))
(define (evaluate exp env)
(cond ((self-evaluating? exp) exp)
;; ... original code
((call/cc? exp)
(let ((p (evaluate (call/cc-e exp) env)))
(call/cc (λ (k) (apply-procedure p (list k))))))
((throw? exp)
(let ((k (evaluate (throw-k exp) env))
(v (evaluate (throw-v exp) env)))
(k v)))
;; ... original code
))
Пример использования
call/cc
.
(run '(+ 1 (call/cc (lambda (k) (* 10 (throw k 5))))))
;; 6
Для простоты я создал новую специальную форму
throw
вызвать продолжение. Вот
(throw k 5)
. Тем не менее, вы можете сделать это вызовом поддержки
k
напрямую. Это не должно быть слишком сложно.