Metacircular Interpreter while loop в схеме
Почему этот цикл while не работает для метациклического интерпретатора. Как мне запустить это в моем окне взаимодействия?
((while? exp) (eval (while->combination exp) env))
(define (while-condition expr) (cadr expr))
(define (while-body expr) (caddr expr))
(define (while->combination exp)
(sequence->exp
(list (list 'define
(list 'while-iter)
(make-if (while-condition exp)
(sequence->exp (list (while-body exp)
(list 'while-iter)))
'true))
(list 'while-iter))))
1 ответ
Чтобы ответить на этот вопрос, я использовал метациклический оценщик, описанный в SICP 4.1.1, так как в вашем коде отсутствовали некоторые процедуры для запуска.
Так что если у вас есть тестовая форма, как (while (call-something) (do-something-1) (do-something-2)))
Вы можете отправить его по адресу while->combination
как это:
;; NB: notice I quote the code
(while->combination '(while (call-something)
(do-something-1)
(do-something-2)))
Если вы используете DrRacket, вы можете просто поместить его в конец окна определений и нажать Отладка>| и легко пройти через ваш код.
Вывод, который я получаю от запуска это:
(begin
(define (while-iter)
(if (call-something)
(begin (do something-1)
(while-iter))
true))
(while-iter))