(type-of '(sum '(33 77)))
Оценка вышеизложенного состоит вначале в оценке '(sum '(33 77))
и вызове функции type-of
с результатом оценки.
'(sum '(33 77))
- это то же самое, что и (quote (sum (quote (33 77))))
, за исключением того, что апостроф представляет собой синтаксис читателя '
, который превращает последующее, скажем x
, в (quote x)
.
Форма quote
является самооценочной, то есть значение, к которому она относится, является точным значением, которое было указано, здесь (sum '(33 77))
.
Это значение представляет собой данные, представляющие код: оно буквально представляет собой список, построенный во время чтения, который содержит символ sum
, за которым следует другой элемент, список, первым элементом которого является quote
, за которым следует другой список, содержащий 33 и 77, буквальные числа.
Поскольку значением вашего выражения является список, а списки построены с помощью цепочек cons-ячеек, обычно type-of
возвращает cons
.
Если вы удалите один уровень цитат:
(type-of (sum '(33 77)))
Затем оценка (sum '(33 77))
следует обычной оценке вызовов функций, сначала оценивая аргумент '(33 77)
, список литералов и вызывая sum
с ним. Ваша функция возвращает сумму 110, и это значение, которое дается при вызове type-of
. В этом случае вы должны получить числовой тип.