¿Cómo `desactivar` una función en un paquete?
Lo siento, esta es una pregunta de Common Lisp muy novata.
Estoy aprendiendo common-lisp y el sistema de paquetes.
Empecé con "La guía completa para idiotas sobre los paquetes de Common Lisp" dehttp://cl-cookbook.sourceforge.net/packages.html
En el Capítulo 1, el autor definió una función foo
en el paquete:bob
? (make-package :bob)
#<Package "BOB">
? (make-package :jane)
#<Package "JANE">
? (in-package bob)
#<Package "BOB">
? (defun foo () "This is Bob's foo")
FOO
Probé este código línea por línea en mi REPL, pero fallé:
; 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
Y me dijo:
The variable FOO is unbound.
[Condition of type COMMON-LISP:UNBOUND-VARIABLE]
¿Cuál es el problema?
¿Cómo solucionar este problema y hacer que funcione?
Muchas gracias.
PD: Mi entorno es SBCL + quicklisp + slime.
Respuestas
Necesita decirle a Lisp qué paquete usar . En Common Lisp estándar no se especifica qué paquetes usar . SBCL no utiliza ninguno. Si desea que los símbolos del paquete CL estén disponibles, debe usar explícitamente ese paquete.
Paquete JANE
* (make-package :jane)
#<PACKAGE "JANE">
* (describe *)
#<PACKAGE "JANE">
[package]
0 internal symbols.
Para el paquete BOB usamos el paquete 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
El símbolo DEFUN
está disponible en paquete BOB.
* (find-symbol "DEFUN" "JANE")
NIL
NIL
El símbolo NODEFUN
está disponible en el paquete JANE.