% Function EXPORT
Function EXPORT
export
symbols &optional
package => t
symbols - シンボルのリストの指定子
package - パッケージ指定子。デフォルトは現在のパッケージ。
export
はひとつか複数のシンボルを
package(直接か間接によってか)内で
そのpackageの外部シンボルとしてアクセス可能にします。
もしあるsymbolsがすでにpackageの外部シンボルとしてアクセス可能であるとき、
export
はそのシンボルに対して何の効果も持ちません。
もしsymbolがpackage内に内部シンボルとして存在するときは、
それは単純に外部の状態に変更されます。
もしそれがuse-package
を経由して内部シンボルとして
アクセス可能であるときは、それは最初にそのpackage内でimport
され、
それからexport
されます
(symbolは、継承元のsymbolがそのpackageで
使い続けるかどうかに関わらず、packageに存在されます)。
export
は、packageをuse
している全てのパッケージで
各symbolをアクセス可能な状態にします。
そのような全てのパッケージは、名前の衝突チェックが行われます。
チェックは(export s p)
が実行されたとき、
(package-used-by-list p)
で得られる各パッケージq
に対して
(find-symbol (symbol-name s) q)
で確認します。
通常の場合、export
はpackageの初期定義のときに行われるため、
package-used-by-list
の結果はnil
であり
名前の衝突チェックは無視できることに注意してください。
複数の変更が行われるとき、
例えばexport
にシンボルのリストが与えられたとき、
実装がそれぞれの変更を別々に処理することが許されます。
そのため、リストの最初のsymbol以外によって引き起こされる
名前の衝突から中止しても、
リストの最初symbolをunexport
することはありません。
しかし、あるsymbolのexport
による名前衝突エラーで中断しても、
そのsymbolはあるパッケージからはアクセス可能で、
他のパッケージからはアクセス不能になるようなことはありません。
処理されるsymbolのそれぞれについて、
export
はアトミック操作のように動作します。
export
の名前の衝突が、
export
されるsymbolsのひとつと
新たにexport
されるシンボルを継承するpackageに
すでに存在しているシンボルとの間に生じるとき、
その衝突は、export
されるシンボルを選びもう片方をunintern
するか、
あるいはすでに存在しているシンボルを選び、
それをshadowing-symbol
にするか
どちらかで解決できます。
(make-package 'temp :use nil) => #<PACKAGE "TEMP">
(use-package 'temp) => T
(intern "TEMP-SYM" 'temp) => TEMP::TEMP-SYM, NIL
(find-symbol "TEMP-SYM") => NIL, NIL
(export (find-symbol "TEMP-SYM" 'temp) 'temp) => T
(find-symbol "TEMP-SYM") => TEMP-SYM, :INHERITED
パッケージシステムは変更されます。
アクセス可能なシンボル
もしsymbolsのどれかがpackage内でアクセス不可のとき、
型package-error
のエラーが通知されますが、
これは修正可能であることが許されており、
ユーザーは対話式でシンボルをimport
するべきかどうかを指定できます。
import
,
unexport
,
11.1. パッケージの説明
なし。