当我在 Common Lisp 中定义一个函数时,如下所示:
(defun foo (n)
(declare (type fixnum n))
(+ n 42))
我期待一个像这样的电话(foo "a")
立即失败,但在调用时失败+
。是个declare
form 不保证静态类型检查?
传统上,类型声明旨在用作编译器的保证以实现优化目的。对于类型检查,请使用check-type
(但请注意,它也在运行时而不是编译时进行检查):
(defun foo (n)
(check-type n fixnum)
(+ n 42))
也就是说,不同的 Common Lisp 实现对类型声明的解释不同。以SBCL为例,会将它们视为要检查的类型 http://www.sbcl.org/manual/#Declarations-as-Assertions if the safety
政策设定够高。
此外,如果您想要静态检查,SBCL 可能也是您最好的选择,因为它的类型推断引擎会警告您遇到的任何不一致情况。为此,ftype
声明可以得到很好的利用:
CL-USER(1): (declaim (ftype (function (string) string) bar))
CL-USER(2): (defun foo (n)
(declare (type fixnum n))
(bar n))
; in: DEFUN FOO
; (BAR N)
;
; caught WARNING:
; Derived type of N is
; (VALUES FIXNUM &OPTIONAL),
; conflicting with its asserted type
; STRING.
; See also:
; The SBCL Manual, Node "Handling of Types"
;
; compilation unit finished
; caught 1 WARNING condition
FOO
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)