如何在包中“defun”一个函数?
How to `defun` a function in a package?
对不起,这是一个非常新手的 Common Lisp 问题。
我正在学习 common-lisp 和包系统。
我从 http://cl-cookbook.sourceforge.net/packages.html
中的“Common Lisp 包的完整白痴指南”开始
在第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 使用 none。如果您希望包 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
NOT 在包 JANE 中可用。
对不起,这是一个非常新手的 Common Lisp 问题。
我正在学习 common-lisp 和包系统。
我从 http://cl-cookbook.sourceforge.net/packages.html
中的“Common Lisp 包的完整白痴指南”开始在第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 使用 none。如果您希望包 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
NOT 在包 JANE 中可用。