Bagaimana cara `mendefun` fungsi dalam sebuah paket?

Aug 19 2020

Maaf, ini adalah pertanyaan Common Lisp pemula yang sangat baru.

Saya sedang mempelajari sistem cadel dan paket umum.

Saya mulai dengan "Panduan Idiot Lengkap untuk Paket Lisp Umum" dari http://cl-cookbook.sourceforge.net/packages.html

Di Bab 1, penulis mendefinisikan fungsi foodalam paket:bob

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

Saya menguji kode ini baris demi baris di REPL saya, tetapi gagal:

; 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

Dan itu memberi tahu saya:

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

Apa masalahnya?

Bagaimana cara memperbaiki masalah ini dan membuatnya berhasil?

Sangat berterima kasih.

PS: Lingkungan saya adalah SBCL + quicklisp + slime.

Jawaban

5 RainerJoswig Aug 19 2020 at 03:04

Anda perlu memberi tahu Lisp paket mana yang akan digunakan . Dalam Common Lisp standar tidak ditentukan paket mana yang akan digunakan . SBCL tidak menggunakan satupun. Jika Anda ingin simbol dari paket CL tersedia, Anda harus menggunakan paket itu secara eksplisit .

Paket JANE

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


0 internal symbols.

Untuk paket BOB kami menggunakan paket 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

Simbol DEFUNtersedia dalam paket BOB.

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

Simbol DEFUNini TIDAK tersedia dalam paket JANE.