Я думаю, что *evaluator-mode*
по сути своей является глобальной переменной. Например, если вы сделаете это:
> (setf sb-ext:*evaluator-mode* ':interpret)
:interpret
> (setf (symbol-function 'bar)
(lambda (x) x))
#<interpreted-function nil {10026E7E2B}>
> (compiled-function-p #'bar)
nil
, вы получите интерпретируемую функцию. Но если вы сделаете это:
> (setf sb-ext:*evaluator-mode* ':compile)
:compile
> (setf (symbol-function 'bar)
(let ((sb-ext:*evaluator-mode* ':interpret))
(lambda (x) x)))
#<function (lambda (x)) {52C3687B}>
> (compiled-function-p #'bar)
t
, вы этого не сделаете. Я считаю, что, возможно, ошибочно, значение, которое действует в начале каждой формы верхнего уровня, является тем, что имеет значение: как только система решила, что она собирается использовать компилятор-оценщик для формы, она не может изменить свое мнение.
И обратите внимание, что существует сложное определение «формы верхнего уровня», и в частности, что при обработке файла в такой форме, как
(let (...)
(x ...))
тогда (x ...)
не является формой верхнего уровня.