如何在常见的lisp中定义函数之前定义它?

ll *_*l l 4 lisp common-lisp

我将在SBCL中使用以下代码示例获得有关f2的未定义函数警告.我是否有可能首先声明f2,就像在C中一样,以避免警告.我用Google搜索,没有任何线索.

(defun f ()
  (print (f2)))

(defun f2 ()
  (print "f2"))
Run Code Online (Sandbox Code Playgroud)

sds*_*sds 6

如果在单个编译单元中定义它之前使用该函数,例如,同一个文件,则编译器不会抱怨未定义的函数(普通load仍然可以,所以首先编译代码!)

否则,您可以:declaim ftype

(declaim (ftype (function () t) f2)
Run Code Online (Sandbox Code Playgroud)

意思是不f2接受任何参数并返回单个类型t.

但是,在已经加载定义的情况下编译使用该函数的文件更有意义.您可以(并且应该!)将asdf用作特定于Lisp的make(1):指定依赖项,以便编译器在编译其用户时具有所有函数的定义.

  • @lll您可能只是加载文件而不是首先编译它。在 repl 中,使用 `(load (compile-file "file.lisp"))`,或者从 Slime/Sly 中使用 `Cc Ck`。 (2认同)
  • @RainerJoswig:谢谢,我澄清了`declaim` (2认同)