Я получил это из обычной кулинарной книги LISP, но я думаю, что это объяснило, почему макросы LISP хороши в хорошем смысле.
"Макрос - это обычный фрагмент кода на Лиспе, который работает с другим фрагментом предполагаемого кода на Лиспе, переводя его в (исполняемый вариант) исполняемый Лисп. Это может показаться немного сложным, поэтому давайте приведем простой пример. вам нужна версия setq, которая устанавливает две переменные в одно и то же значение, поэтому если вы напишите
(setq2 x y (+ z 3))
, когда z=8
и x, и y установлены на 11. (Я не могу думать об этом, но это просто пример.)
Должно быть очевидно, что мы не можем определить setq2 как функцию. Если x=50
и y=-5
, эта функция получит значения 50, -5 и 11; он не знал бы, какие переменные должны быть установлены. Что мы действительно хотим сказать, так это то, что когда вы (система Lisp) видите (setq2 v1 v2 e)
, относитесь к нему как к (progn (setq v1 e) (setq v2 e))
. На самом деле, это не совсем правильно, но пока подойдет. Макрос позволяет нам сделать это точно, указав программу для преобразования входного шаблона (setq2 v1 v2 e)
"в выходной шаблон (progn ...)
."
Если вы подумали, что это хорошо, вы можете прочитать здесь:
http://cl -cookbook.sourceforge.net / macros.html