Почему функция/макродиктомия присутствует в Common Lisp?
Каковы логические проблемы при разрешении одного и того же имени, представляющего как макрос (имеющий приоритет при обнаружении в позиции функции в compile/eval), так и функцию (используемую, например, с mapcar
)?
Например, имея second
, определяемый как макрос, и как функция, позволит использовать
(setf (second x) 42)
и
(mapcar #'second L)
не создавая никаких трюков setf
.
Конечно, понятно, что макросы могут выполнять больше, чем функции, поэтому аналогия не может быть полной (и я не думаю, конечно, что каждый макросъемка также является функцией), но почему это запрещено путем совместного использования одного пространства имен, когда это может быть полезно?
Надеюсь, я никого не обижу, но я действительно не нахожу "Зачем это делать?" ответ действительно уместен... Я ищу, почему это плохая идея. Наложение произвольного ограничения, потому что не известно хорошее использование, IMO несколько высокомерен (вроде бы предполагает идеальную предвидения).
Или существуют ли практические проблемы в его разрешении?