За исключением специальных форм, большинство Лиспов сначала оценивают аргументы, затем применяют функцию (отсюда и фразу eval-and-apply).
Ваша первая форма (+ 1 '1)
сначала оценивает свои аргументы 1
и'1
.Постоянные числовые значения оцениваются сами по себе, а кавычка оценивается по отношению к тому, что она цитирует, так что вам осталось бы применить +
к 1
и 1
, получив 2
.
eval: (+ 1 (quote 1))
eval 1st arg: 1 ==> 1
eval 2nd arg: '1 ==> 1
apply: (+ 1 1) ==> 2
Второйформа аналогична, без кавычек 1 будет проходить через eval
один раз, снова давая 1
:
eval: (+ 1 (eval '1))
eval 1st arg: 1 ==> 1
eval 2nd arg: (eval '1)
eval arg: '1 ==> 1
apply: (eval 1) ==> 1
apply: (+ 1 1) ==> 2