package - 如何 `defun`包中的函数?

标签 package common-lisp sbcl

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

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

我从 http://cl-cookbook.sourceforge.net/packages.html 中的“The Complete Idiot's Guide to Common Lisp Packages”开始

在第1章中,作者在:bob

包中定义了一个函数foo
? (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 + slime。

最佳答案

你需要告诉 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

符号 DEFUN 在包 BOB 中可用。

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

符号 DEFUN 在包 JANE 中可用。

关于package - 如何 `defun`包中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63474681/

相关文章:

java - 使用 Java 创建和编辑 Excel 文档 (.csv)

common-lisp - 获取SBCL中的线程ID

python - 如何安装 python gtkmozembed 包或者在 Windows 中是否有 python GtkMozEmbed 的替代品?

linux - 创建已编译库的二进制包

oop - Common Lisp 中类的 getter 和 setter

common-lisp - 使用 Ironclad 和 Flexi-stream 进行哈希处理

lisp - 如何在 Common Lisp 上正确传递参数?

lisp - 从 SBCL 访问自定义 bash 脚本

python - 如何构建模块以避免出现类似 "import module.module.module"的情况

character-encoding - 如何处理 Common Lisp (SBCL) 中的重音符号?