パッケージ内の関数を「defun」する方法は?
Aug 19 2020
申し訳ありませんが、これは非常に初心者のCommonLispの質問です。
私はcommon-lispとパッケージシステムを学んでいます。
私は「CommonLispパッケージの完全な馬鹿ガイド」から始めました。 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でこのコードを1行ずつテストしましたが、失敗しました。
; 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 +スライムです。
回答
5 RainerJoswig Aug 19 2020 at 03:04
どのパッケージを使用するかをLispに指示する必要があります。標準のCommonLispでは、どのパッケージを使用するかは指定されていません。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では使用できません。