С (consp 'notdefinedsymbol)
consp
в позиции оператора является символом для функции #'consp
, и, следовательно, ее аргумент (quote notdefinedsymbol)
, сокращенно просто 'notdefinedsymbol
, должен быть оценен перед применением. A (quote x)
соответствует данным x
, поэтому в нашем случае аргумент становится символом notdefinedsymbol
. Это НЕ cons
, а symbolp
, и, следовательно, результат равен nil
Со вторым у вас есть (find-if #'consp '('notdefinedsymbol))
, и, поскольку find-if
является функцией, он оценивает свои аргументы. #'consp
оценивает функциональный объект, а '('notdefinedsymbol)
, что является сокращением от (quote ((quote notdefinedsymbol)))
, оценивает. Как всегда, он оценил свой аргумент ((quote notdefinedsymbol))
. Это список с одним элементом, который сам является списком с двумя элементами, символами quote
и notdefinedsymbol
. Поскольку (consp '(quote notdefinedsymbol) ; ==> t
find-if
оценивается как (quote notdefinedsymbol)
, и некоторые принтеры CL сокращают список из двух элементов, где первый элемент - quote
, так же, как макрос чтения, и выдают 'notdefinedsymbol
, но он по-прежнему является списком из двух элементов, так как это не код, а данные.
Ваша ошибка, конечно, в том, что вы вкладываете цитаты. Если вы сделали это так, вы получите ожидаемый результат:
(find-if #'consp '(notdefinedsymbol)) ; ==> nil