Я знаю, что есть macro-function
, объяснено здесь , которое позволяет вам проверять, но возможно ли просто при чтении исходного кода lisp иногда делать вывод о том, на что вы смотрите " это должен быть макрос "? (при условии, конечно, что вы никогда раньше не видели функцию / макрос).
Я вполне уверен, что ответ - да, но, поскольку это кажется настолько фундаментальным, я подумал, стоит спросить, особенно потому, что любые нюансы по этому поводу могут быть ценными и интересными.
В ANSI Common Lisp Пола Грэма, стр. 70, он описывает, как использовать defstruct
.
Когда я вижу (defstruct point x y)
, если бы я абсолютно ничего не знал о том, что такое defstruct
, это вполне могло бы быть функцией.
Но когда я вижу
(defstruct polemic
(subject "foo")
(effect "bar"))
Я знаю, что должен быть макросом, потому что (предположим), я также знаю, что subject
и effect
являются неопределенными функциями. (Я знаю , что , потому что они ошибаются с undefined function
при вызове «на верхнем уровне» (?)) (Если это правильный термин).
Если бы два аргумента списка в defstruct
были указаны, это было бы не так просто. Поскольку они не указаны, это должен быть макрос.
Это так просто?
Я немного изменил имена полей по сравнению с теми, что использовались в книге, чтобы прояснить этот вопрос.
Наконец, Грэм пишет:
«Мы можем указать значения по умолчанию для структурных полей, заключив имя поля и выражение по умолчанию в список в исходном определении»
Что я замечаю, так это то, что это правда, но это не (цитируемый) список. Если бы кто-то из читателей этого поста сформулировал вышеприведенное предложение по-другому (учитывая, что макросы еще не были введены в книгу (хотя у меня есть базовое представление о том, что они из себя представляют)).
Мне кажется, что это не "список данных", в которые заключены выражения по умолчанию. (Извинения за плохую терминологию) - поиск правильной концепции здесь.