จะ `เลิกใช้งาน 'ฟังก์ชันในแพ็คเกจได้อย่างไร?

Aug 19 2020

ฉันขอโทษนี่เป็นคำถาม 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]

มีปัญหาอะไร?

จะแก้ไขปัญหานี้และทำให้มันได้อย่างไร?

ขอบคุณมาก.

PS: สภาพแวดล้อมของฉันคือ SBCL + quicklisp + slime

คำตอบ

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นี้ไม่มีอยู่ในแพ็คเกจ JANE