Я основываюсь на каком-то старом коде Common Lisp, написанном другими, который включает такие строки, как следующие, в начале нескольких функций:
(declare (ftype (function (&rest float) float) + - * min max))
Насколько я понимаю, цель этого состоит в том, чтобы сообщить компилятору, что пять функций, перечисленных в конце формы, будут передаваться только с плавающей запятой. Компилятор может использовать эту информацию для создания более эффективного кода.
Некоторые Лиспы не жалуются на это объявление (ABCL, CCL, ECL, LispWorks, CLISP), но SBCL не примет это объявление в конфигурации по умолчанию. SBCL можно заставить принять его, поместив
(unlock-package 'common-lisp)
в файле инициализации .sbclrc. Это то, чем я занимаюсь последний год или около того. Я предполагаю, что это необходимо, потому что в этом пакете есть +, - и т. д., и код изменяет объявления этих функций.
Мой вопрос: может ли объявление типа функции встроенных функций, таких как + и min, оказать благотворное влияние на скомпилированный код в SBCL? (Если может, то почему SBCL жалуется на эти объявления по умолчанию?) Не лучше ли удалить такие объявления ftype, а затем избавиться от строки unlock-package
в .sbclrc?
Спасибо.