如果我有一个接受函数参数的函数,为了优化目的,我可以声明它为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))声明进行编译以进行复制)。
所以,我的问题是:
function和(function ...)做同样的事情,我会同意的,但实际上它做得更糟。还是应该将其视为SBCL中的一个bug?SysInfo: SBCL 1.3.18
发布于 2017-10-02 09:24:37
从SBCL手册(4.2.3使现有程序运行):
某些不正确的声明只能通过运行时类型检查来检测.因为SBCL编译器比其他通用Lisp编译器进行更多的类型推断,所以不正确的声明会对造成更大的损害。
这是可能的,这就是为什么您的函数在包含变量类型声明时表现更差的原因。
此外:
最常见的问题是变量的常量初始值与类型声明不匹配。不正确的常量初始值将始终由编译时类型错误标记,并且一旦找到它们就很容易修复。考虑一下这个代码片段: (prog ( foo ) (宣布(固定地址)) (setq foo.)) 在这里,foo被赋予一个初始值为零,但被声明为一个固定值。即使从未读取,变量的初始值也必须与声明的类型匹配。有两种方法可以解决这个问题。更改声明 (prog ( foo ) (声明(类型(或fixnum null) foo)) (setq .).) 或更改初始值。 (prog ((foo 0)) (宣告(fixnum foo)) (setq foo .)
这来自SBCL (1.4)当前版本的手册,因此它可能适用于您的情况,也可能不适用于您。
https://stackoverflow.com/questions/46297512
复制相似问题