使用(declare(type ...))但仍然具有'安全'功能

Mic*_*rus 6 common-lisp compiler-optimization

是否可以(declare (type ...))在函数中使用声明,还可以对函数参数执行类型检查,以便生成更快但仍然安全的代码?

例如,

(defun add (x y)
    (declare (type fixnum x y))
    (the fixnum x y))
Run Code Online (Sandbox Code Playgroud)

当被调用时(add 1 "a")会导致未定义的行为,所以我最好将其修改为

(defun add (x y)
    (declare (type fixnum x y))
    (check-type x fixnum)
    (check-type y fixnum)
    (the fixnum x y))
Run Code Online (Sandbox Code Playgroud)

但我担心编译器可以假设check-type总是通过,因此省略了检查.

所以我的问题是,上面的例子是错误的,因为我期望它,其次,是否有任何常见的习惯用法*用于实现优化代码的类型安全?

*)我可以想象,例如,使用优化的lambda并在进行类型检查后调用它,但我想知道这是否是最优雅的方式.

Rai*_*wig 8

您始终可以先检查类型,然后输入优化代码:

(defun foo (x)
  (check-type x fixnum)
  (locally
    (declare (fixnum x)
             (optimize (safety 0)))
    x))
Run Code Online (Sandbox Code Playgroud)

LOCALLY用于本地声明.