% 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. パッケージの説明
なし。