패키지에서 함수를 'defun'하는 방법은 무엇입니까?

Aug 19 2020

죄송합니다. 이것은 매우 새로운 Common Lisp 질문입니다.

나는 common-lisp 및 패키지 시스템을 배우고 있습니다.

저는 "The Complete Idiot 's Guide to Common Lisp Packages"로 시작했습니다. http://cl-cookbook.sourceforge.net/packages.html

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]

뭐가 문제 야?

이 문제를 해결하고 작동시키는 방법은 무엇입니까?

정말 고마워.

추신 : 내 환경은 SBCL + quicklisp + 슬라임입니다.

답변

5 RainerJoswig Aug 19 2020 at 03:04

사용할 패키지를 Lisp에 알려야 합니다 . 표준 Common Lisp에서는 사용할 패키지가 지정되어 있지 않습니다. SBCL 없음을 사용합니다 . 패키지 CL의 심볼을 사용할 수 있도록하려면 해당 패키지 를 명시 적으로 사용해야 합니다.

JANE 패키지

* (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 패키지 제인에서 사용할 수 있습니다.