Достаточно легко написать макрос, который спрашивает "оценивает ли данное выражение себя". Фактически это хороший пример задач, которые могут быть выполнены только с помощью макроса, потому что они должны видеть аргумент как оцененный, так и неоцененный.
(defmacro selfp [a] `(= ~a (quote ~a)))
#'user/selfp
user> (selfp 1)
true
user> (selfp +)
false
user> (selfp [1 2])
true
user> (selfp '(+ 1 2 3))
false
Несмотря на то, что строки, числа, символы, ключевые слова и логические значения являются самооценочными, другие вещи, такие как [1 2]
, также могут быть полезными, так что в общем случае это может оказаться бесполезным.