Есть ли метациркулярный оценщик 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напрямую. Это не должно быть слишком сложно.

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