Comment "defun" une fonction dans un package ?
Je suis désolé, c'est une question très débutante en Common Lisp.
J'apprends le common-lisp et le système de paquets.
J'ai commencé avec "The Complete Idiot's Guide to Common Lisp Packages" dehttp://cl-cookbook.sourceforge.net/packages.html
Au chapitre 1, l'auteur a défini une fonction foo
dans le package:bob
? (make-package :bob)
#<Package "BOB">
? (make-package :jane)
#<Package "JANE">
? (in-package bob)
#<Package "BOB">
? (defun foo () "This is Bob's foo")
FOO
J'ai testé ce code ligne par ligne dans mon REPL, mais j'ai échoué :
; 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
Et il m'a dit :
The variable FOO is unbound.
[Condition of type COMMON-LISP:UNBOUND-VARIABLE]
Quel est le problème?
Comment résoudre ce problème et le faire fonctionner?
Milles mercis.
PS : Mon environnement est SBCL + quicklisp + slime.
Réponses
Vous devez indiquer à Lisp quel paquet utiliser . Dans le Common Lisp standard, les packages à utiliser ne sont pas spécifiés . SBCL n'en utilise aucun. Si vous souhaitez que les symboles du package CL soient disponibles, vous devez utiliser explicitement ce package.
Forfait JANE
* (make-package :jane)
#<PACKAGE "JANE">
* (describe *)
#<PACKAGE "JANE">
[package]
0 internal symbols.
Pour le package BOB, nous utilisons le package 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
Le symbole DEFUN
est disponible dans le package BOB.
* (find-symbol "DEFUN" "JANE")
NIL
NIL
Le symbole DEFUN
n'est PAS disponible dans le package JANE.