Я видел один ответ Как Lisp позволяет вам переопределить сам язык?
Вопрос переполнения стека (ответил Ноа Лавин):
Макросы - не совсем полное переопределение языка, по крайней мере, насколько я знаю (на самом деле я - Схемер; я могу ошибаться), потому что есть ограничение. Макрос может взять только одно поддерево вашего кода и сгенерировать одно поддерево для его замены. Поэтому вы не можете писать макросы, преобразующие целую программу, как бы круто это ни было.
После прочтения этого мне интересно узнать, существуют ли "макросы, преобразующие целую программу" в Lisp или Scheme (или некотором другом языке).
Если нет, то почему?
- Это бесполезно и никогда не требуется?
- Та же самая вещь может быть достигнута другими способами?
- Невозможно реализовать это даже в Лиспе?
- Возможно, но никогда не пробовали или не реализовывали?
Обновление
Один вид использования
например,
Как в коде stumpwm
вот некоторые функции в разных исходных файлах lisp
использует динамическую / глобальную переменную defvar * screen-list *, которая определена в primitives.lisp , но используется в screen.lisp , пользователя. lisp , window.lisp .
(Здесь у каждого файла есть функции, класс, переменные, связанные с одним аспектом или объектом)
Теперь я хотел определить эти функции под замыканием, где
* screen-list * переменная доступна в форме let, она не должна быть
динамическая / глобальная переменная, но без перемещения всех этих функций в
одно место (потому что я не хочу, чтобы эти функции потеряли место от их
связанный файл)
Так что эта переменная будет доступна только этим функциям.
Выше, например, в равной степени относится к меткам и флетам, чтобы в дальнейшем
что мы могли бы сделать это так, что только требуемая переменная, функция будет доступна,
тем, кто в этом нуждается.
Обратите внимание, один из способов может быть
реализовать и использовать некоторый макрос defun_with_context для defun, где первый аргумент
контекст, где let, определяют переменные flet.
Но помимо этого это может быть достигнуто читателем-макросом как
Ватин и Гарет Рис ответили.