Отражающие возможности схемы R7RS
Отчет R7RS на языке программирования Scheme описывает два способа запуска кода Scheme в системе Scheme:
1) Система схем может запускать программу, как описано в разделе 5.1 отчета.
2) Система схем может предложить цикл чтения-оценки-печати, в котором код Схемы интерпретируется в интерактивном режиме.
Мой вопрос заключается в том, как эти два способа выполнения кода Scheme могут быть отражены в системе Scheme с помощью того, что включено в отчет R7RS.
Есть процедура eval library eval
, который выполняет код Scheme внутри работающей системы Scheme, так eval
похоже на то, что я ищу.
Тем не менее, единственная гарантированная изменяемая среда, которую я могу подключить eval
среда возвращается interaction-environment
процедура библиотеки repl. При этом, однако, я не могу надежно смоделировать REPL (пункт 2) сверху), поскольку REPL допускает форму импорта, которую eval
Процедура не должна.
Кроме того, я не могу использовать среду взаимодействия для eval
использование полной программы Scheme по другим причинам: обычно она не пустая, в частности она содержит все привязки (scheme base)
,
Для реализации 1) внутри работающей системы Scheme, процедура eval library environment
выглядит многообещающе, так как позволяет заранее импортировать библиотеки (что является частью запущенных программ). Тем не менее, среда неизменна, поэтому я не могу оценить define
внутри окружающей среды. Выходом было бы обернуть тело программы для запуска в lambda
сформировать так, чтобы define
будет определять локальные переменные. Тем не менее, это также не работает: внутри lambda
форма все определения должны находиться в начале тела (что не относится к верхнему уровню программы Scheme) и внутри lambda
Привязки библиотеки форм могут быть переписаны лексически, что невозможно при привязках верхнего уровня.
Поскольку схема завершена по Тьюрингу, я, конечно, могу смоделировать систему Scheme внутри работающей системы Scheme, но мне интересно, возможно ли это, просто используя eval
процедура. Одна из причин моего интереса заключается в том, что eval
может быть оптимизировано (например, с помощью бэкэнда JIT-компилятора), поэтому использование этой процедуры может дать почти естественную скорость (по сравнению с написанием простого интерпретатора вручную).
1 ответ
R7RS-small не предназначен для такого рода реализации. R7RS-large предоставит библиотеку, которая поддерживает изменяемые пользователем среды.