LINUX.ORG.RU

История изменений

Исправление quasimoto, (текущая версия) :

ты без quote давай

(my-cond-macro ((> 1 2) 1) ((< 1 2) 2) (nil 3))

Видишь где-то определение my-cond-macro? Его нет, потому что my-cond-macro это ни что иное как my-cond-function на нужной стадии.

Тут товарищ распинался, что напишет функцию, полностью эквивалентную макросу.

Ну дык любой макрос это просто функция - (macro-function 'любой-макрос), она с AST работает во время мета-стадии.

Исторически в древних лиспах так и велосипедили - делали quote, функции (стадии выполнения) и eval, потом эта машинерия (quote и eval) спряталась в экспандере, мета-стадия была явно выделена вместе с разграничением символов по функциям (стадии выполнения) и макросам (функциям стадии раскрытия). Хотя кое-кто эту историю проходит снова, picolisp, например.

Исходная версия quasimoto, :

ты без quote давай

(my-cond-macro ((> 1 2) 1) ((< 1 2) 2) (nil 3))

Видишь где-то определение my-cond-macro? Его нет, потому что my-cond-macro это ни что иное как my-cond-function на нужной стадии.

Тут товарищ распинался, что напишет функцию, полностью эквивалентную макросу.

Ну дык любой макрос это просто функция - (macro-function 'любой-макрос), он с AST работает во время мета-стадии.

Исторически в древних лиспах так и велосипедили - делали quote, функции (стадии выполнения) и eval, потом эта машинерия (quote и eval) спряталась в экспандере, мета-стадия была явно выделена вместе с разграничением символов по функциям (стадии выполнения) и макросам (функциям стадии раскрытия). Хотя кое-кто эту историю проходит снова, picolisp, например.