【发布时间】:2017-09-19 10:00:53
【问题描述】:
如果我有一个接受函数参数的函数,出于优化目的,我可以将其声明为function,比如说
(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 中通常在优化方面没有用吗?
系统信息:SBCL 1.3.18
【问题讨论】:
-
我似乎无法在 SBCL 1.3.21 / Linux 上重现这一点。
(defun foo (f) (declare (type (function (fixnum) fixnum) f)) (funcall f 10))不给出警告,反汇编与(type function f)相同。 SBCL 还检查提供给(funcall f ...)的参数是否是一个fixnum,并得出FOO返回一个fixnum。 -
@jkiiski Windows 目前只有 1.3.18 版本,将使用 1.3.21 进行编译和检查
标签: optimization lisp common-lisp sbcl