SBCL前瞻性声明:可能吗?

时间:2014-05-13 06:55:18

标签: forward-declaration sbcl

我在SBCL中编写了一些代码,当我将文件加载到REPL中时,我的函数的顺序一直会导致出现以下类型的警告:

;caught STYLE-WARNING:
    undefined function: FOO

其中FOO是函数的符号。这纯粹是由于它们在我的文件中的排序方式,因为函数FOO 定义的,而不是在抛出该警告的代码部分之前。

现在,在Clojure中,我熟悉的是Lisp,我有declare形式,它允许我做出前瞻性声明以避免这种问题。是否有类似SBCL / Common Lisp的类似内容?

2 个答案:

答案 0 :(得分:3)

我们可以使用'(declaim(ftype ...))':

(declaim (ftype (function (integer list) t) ith))

(defun foo (xs)
  (ith 0 xs))

(defun ith (n xs)
  (nth n xs))

函数'foo'和'ith'都可以正常工作,并且没有任何样式警告。

http://www.lispworks.com/documentation/HyperSpec/Body/d_ftype.htm

答案 1 :(得分:2)

这是我在手册第4.1.1节中找到的内容:

CL-USER> (defun foo (x) (bar x))
; in: DEFUN FOO
;     (BAR X)
; 
; caught STYLE-WARNING:
;   undefined function: BAR
; 
; compilation unit finished
;   Undefined function:
;     BAR
;   caught 1 STYLE-WARNING condition
FOO
CL-USER> (declaim (sb-ext:muffle-conditions style-warning))
; No value
CL-USER> (defun baz (y) (quux y))
BAZ

所以你至少可以使风格警告保持沉默。

我还考虑过SBCL如何处理REPL中的评估步骤:它编译代码。所以我重新启动了劣质的lisp进程并运行了#34;编译区域"在以下两行:

(defun foo (x) (bar x))
(defun bar (y) (baz y))

和SBCL只抱怨baz,但不是bar。您是否将单个功能提供给SBCL或更大的块?