Во-первых, если вы делаете то, что делаете, вы не ошибетесь, прочитав хотя бы первую главу Металингвистическая абстракция Структура и интерпретация компьютерных программ .
Теперь несколько предложений от себя.
Обычная вещь, которую нужно сделать с символом для интерпретатора Scheme (или, фактически, любого Lisp), - это поискать его в некой «среде». Если вы собираетесь написать свой собственный eval
, вы, вероятно, захотите предоставить свои собственные структуры среды, которые будут соответствовать этому. Единственное, для чего вы можете обратиться к системе Scheme, на которой вы строите свой eval
, - это исходная среда, содержащая привязки для таких вещей, как +
, cons
и т. Д .; насколько я знаю, это не может быть достигнуто на 100% портативным способом из-за того, что различные системы Scheme предоставляют различные способы получения информации в исходной среде (включая специальную форму the-environment
в схеме MIT и interaction-environment
in (Petite). ) Chez Scheme ... и не спрашивайте меня, почему это так), но основная идея остается прежней:
(define (my-eval form env)
(cond ((self-evaluating? form) form)
((symbol? form)
;; note the following calls PCS's built-in eval
(if (my-kind-of-env? env)
(my-lookup form env)
;; apparently we're dealing with an environment
;; from the underlying Scheme system, so fall back to that
;; (note we call the built-in eval here)
(eval form env)))
;; "applicative forms" follow
;; -- special forms, macro / function calls
...))
Обратите внимание, что вы непременно захотите проверить, необходимы ли для символов имена специальных форм (lambda
и if
- или вы можете использовать cond
вместо if
- но вы, скорее всего, хотеть большего и, возможно, разрешить расширения базового набора, т. е. макросы). С указанным выше скелетом eval
это должно было бы происходить в том, что я назвал обработчиками «аппликативной формы», но вы могли бы также обработать это, когда вы имеете дело с символами, или, возможно, сначала поместить специальные обработчики форм, а затем обычный поиск символов. и функция приложения.