如果我有一個接受函數的參數,優化目的的功能,我可以宣佈它是一個function
,假設SBCL優化:函數的類型聲明
(defun foo (f)
(declare (type function f))
...)
不過,我可以更加具體:
(defun foo (f)
(declare (type (function (double-float) double-float) f))
...)
即告知f
將接受一個double-float
參數和返回一個double-float
值。但是,SBCL似乎能夠對前者進行更好的優化,對於後者,它說它不知道f
是否爲fdefinition
(嘗試使用(optimize (speed 3))
聲明進行編譯以重現)。
所以,我的問題是:
難道我做錯了什麼?特別是如果SBCL只會爲
function
和(function ...)
做同樣的事情,我會對它好,但實際上它會變得更糟。或者它應該被認爲是SBCL中的一個錯誤?函數類型聲明在CL中根據某種原因在優化方面通常是無用的嗎?
SYSINFO:SBCL 1.3.18
我似乎無法在SBCL 1.3.21/Linux上重現此操作。 '(defun foo(f)(declare(type(function(fixnum)fixnum)f))(funcall f 10)''不會給出警告,反彙編與'(function function f)'相同。 SBCL還會檢查給予'(funcall f ...)'的參數是否爲fixnum並且派生出'FOO'返回一個fixnum。 – jkiiski
@jkiiski Windows現在只有1.3.18版本,用1.3.21編譯和檢查 – mobiuseng