我在SBCL中编写了一些代码,当我将文件加载到REPL中时,我的函数的顺序一直会导致出现以下类型的警告:
;caught STYLE-WARNING:
undefined function: FOO
其中FOO
是函数的符号。这纯粹是由于它们在我的文件中的排序方式,因为函数FOO
是定义的,而不是在抛出该警告的代码部分之前。
现在,在Clojure中,我熟悉的是Lisp,我有declare
形式,它允许我做出前瞻性声明以避免这种问题。是否有类似SBCL / Common Lisp的类似内容?
答案 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或更大的块?