В реальном коде избегайте подобных оптимизаций - если это действительно не нужно
Практично ли заставить SBCL "оптимизировать возможный вызов FDEFINITION" или компилятор отмечает, чтообъяснение, а не возможность?
Как правило, это не имеет значения, тем более что большая часть кода на Лиспе не должна компилироваться с оптимизацией (speed 3) (safety 0) (space 0)
, поскольку она может открыть программное обеспечениеошибки во время выполнения и сбои в зависимости от реализации и используемой программы. Вызывать вещи без проверки (без safety
), кроме функций или функций именования символов, через funcall
может быть достаточно опасно, чтобы вызвать сбой программы.
Для конкретного теста можно проверить с помощью таймингов, является ли типобъявление и специализированная fdefinition
компиляция дают любое преимущество.
объявление типа
Объявление типа, чтобы прояснить, что переменная с именем fn
ссылается на объекттипа function
будет иметь значение:
(declare (type function fn))
в конкретной программе тестирования FDEFINITION в любом случае не будет вызываться
В приведенном вами примере fdefinition
не будет вызван в любом случае.
(setf foo (lambda (x) x)) ; foo references a function object
(funcall foo 3)
funcall
, вероятно, реализован примерно так:
(etypecase f
((or cons symbol) (funcall (fdefinition f) ...))
(function ...))
Поскольку ваш код передает функциональный объект, никогда не требуется вызывать fdefinition
.
Преимущество оптимизации заключается в том, что диспетчеризация типа времени выполнения может быть удалена, а мертвый код для аргумента "против" или символа ...