Существуют ли макросы преобразования всей программы в Lisp или Scheme?

Я видел один ответ Как Lisp позволяет вам переопределить сам язык? Вопрос о переполнении стека (ответил Ноа Лавин):

Макросы - не совсем полное переопределение языка, по крайней мере, насколько мне известно (я на самом деле программист; я могу ошибаться), потому что есть ограничение. Макрос может взять только одно поддерево вашего кода и создать одно поддерево для его замены. Следовательно, вы не можете писать макросы, преобразующие всю программу, как бы круто это ни было.

После прочтения этого мне стало любопытно, есть ли «макросы преобразования всей программы» в Lisp или Scheme (или на каком-либо другом языке). ). например,

Как в коде stumpwm вот несколько функций в разных исходных файлах Lisp использует динамическую / глобальную переменную defvar * screen-list * , которая определена в primitives.lisp , но используется пользователем screen.lisp , . lisp , window.lisp . (Здесь каждый файл имеет функции, класс, переменные, относящиеся к одному аспекту или объекту)

Теперь я хотел определить эти функции в закрытии, где * screen-list * переменная доступна в форме let, она не должна быть динамическая / глобальная переменная, но без перемещения этих всех функций в одно место (потому что я не хочу, чтобы эти функции теряли место связанный файл) Таким образом, эта переменная будет доступна только для этих функций.

Выше, например, одинаково применимо к метке и флету, так что в дальнейшем будет возможно что мы можем сделать так, чтобы была доступна только необходимая переменная, функция, тем, кто в этом нуждается.

Обратите внимание, что одним из способов может быть реализовать и использовать макрос defun_with_context для defun, где первым аргументом является context, где let, переменные flet определяют. Но помимо этого, это может быть достигнуто с помощью читателя-макроса как Ответили Ватин и Гарет Рис.

6
задан Community 23 May 2017 в 12:07
поделиться