Я не был полностью уверен, каков синтаксис вашего интерпретируемого языка, но похоже, что вы реализовали lambda
, и это все, что вам действительно нужно, чтобы получить много синтаксического сахара. Вы можете реализовать такие вещи, как for
циклы, используя lambda
.
Все, что вам действительно нужно сделать, это добавить функцию for-handler
, которая анализирует выражение вроде:
(for (i 0 (< 1 10))
(print i))
в
((lambda ()
(define (loop i n)
(if (or (< i n) (= i n))
(begin (print i) (loop (+ 1 i) n))))
(loop 1 10)))
, а затем снова передает это новое выражение в interpret
. Приведенный выше код взят из моего решения к упражнению SICP 4.9
Я не тратил слишком много времени, пытаясь выяснить, поддерживает ли ваш интерпретатор внутренние определения, как это, но похоже, что у вас есть with
, который может позволить вам сделать что-то вроде этого:
(with (loop (lambda (i n)
(if (or (< i n) (= i n))
(begin (print i) (loop (+ 1 i) n))))
(loop 1 10))
По сути, вам нужно расширить выражение for
в приложении рекурсивной функции. Приведенный выше код определяет функцию с именем loop
и немедленно вызывает ее. Внешний lambda
заставляет все выражение выполняться сразу.
Если вам нужны более подробные сведения об этом, в превосходной Структуре и интерпретации компьютерных программ есть глава , посвященная созданию мета-циклических интерпретаторов, и обсуждаются вопросы реализации внутренних определений, а также они называют «производные выражения», которые в основном сахар, как for
.
Удачи!