如何在一个包中`defun`一个函数?

问题描述

对不起,这是一个非常新手的Common Lisp问题。

我正在学习common-lisp和打包系统。

我从http://cl-cookbook.sourceforge.net/packages.html开始阅读了“常见Lisp软件包的完整傻瓜指南”

在第1章中,作者在包foo中定义了一个函数:bob

? (make-package :bob)
#<Package "BOB">
? (make-package :jane)
#<Package "JANE">
? (in-package bob)
#<Package "BOB">
? (defun foo () "This is Bob's foo")
FOO

我在REPL中逐行测试了此代码,但失败了:

; SLIME 2.26
CL-USER> (make-package :bob)
#<PACKAGE "BOB">
CL-USER> (make-package :jane)
#<PACKAGE "JANE">
CL-USER> (in-package bob)
#<COMMON-LISP:PACKAGE "BOB">
BOB> (defun foo () "This is Bob's foo")
; in: DEFUN FOO
;     (BOB::DEFUN BOB::FOO NIL "This is Bob's foo")
; 
; caught COMMON-LISP:STYLE-WARNING:
;   undefined function: BOB::DEFUN
; 
; caught COMMON-LISP:WARNING:
;   undefined variable: BOB::FOO
; 
; compilation unit finished
;   Undefined function:
;     DEFUN
;   Undefined variable:
;     FOO
;   caught 1 WARNING condition
;   caught 1 STYLE-WARNING condition

它告诉我:

The variable FOO is unbound.
   [Condition of type COMMON-LISP:UNbound-variable]

出什么问题了?

如何解决此问题并使之正常工作?

非常感谢。

PS:我的环境是SBCL + quicklisp +粘液。

解决方法

您需要告诉Lisp 使用哪个软件包。在标准Common Lisp中,未指定使用的软件包。 SBCL 不使用。如果希望使用包CL的符号,则必须明确使用该包。

打包简

* (make-package :jane)
#<PACKAGE "JANE">
* (describe *)
#<PACKAGE "JANE">
  [package]


0 internal symbols.

对于包BOB,我们使用包CL:

* (make-package "BOB" :use '("CL"))
#<PACKAGE "BOB">
* (describe *)
#<PACKAGE "BOB">
  [package]


Use-list: COMMON-LISP
0 internal symbols.


* (find-symbol "DEFUN" "BOB")
DEFUN
:INHERITED

BOB软件包中提供了符号DEFUN

* (find-symbol "DEFUN" "JANE")
NIL
NIL

JANE软件包中的符号DEFUN 可用。