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

Другие вопросы по тегам