Написание процедуры Eval в схеме? - PullRequest
1 голос
/ 13 апреля 2010

Моя проблема не в встроенной процедуре eval, а в том, как ее упростить. Для начала я хотел бы иметь возможность взять это в '(+ 1 2) и дать ему оценить выражение +, где цитата обычно снимает оценку.

Я думал об этом и нашел пару вещей, которые могут быть полезны: Unquote:, (Quasiquote) (Применяются)

Моя главная проблема - восстановление значения + как процедуры, а не символа. Как только я получу это, я думаю, что я просто смогу использовать его с другим содержимым списка.

Любые советы или рекомендации будут высоко оценены.

1 Ответ

3 голосов
/ 13 апреля 2010

Во-первых, если вы делаете то, что делаете, вы не ошибетесь, прочитав хотя бы первую главу Металингвистическая абстракция Структура и интерпретация компьютерных программ .


Теперь несколько предложений от себя.

Обычная вещь, которую нужно сделать с символом для интерпретатора 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 это должно было бы происходить в том, что я назвал обработчиками «аппликативной формы», но вы могли бы также обработать это, когда вы имеете дело с символами, или, возможно, сначала поместить специальные обработчики форм, а затем обычный поиск символов. и функция приложения.

...