APL/J言語:ロケール特有の名前(ローカティブ)
ローカティブabc_f_と書いた場合、ロケールfのabcのことを指します。間接ローカティブabc__xyと書いた場合、変数xyの値が名称のロケールでのabcのことを指します。旧バージョンとの連続性(コンパティビリティ)のために、非標準的な表記abc__はabc_base_として受け入れられます。
b=: 1 Rome=: 2 Rome_NewYork_=: 20 f_NewYork_=: 3 : '3*b=: Rome+y' f_NewYork_ 10 90 b,Rome 1 2 b_NewYork_ 30
明示的定義(:)において、代入時に=.で代入されたもの意外の名前はグローバルです。グローバル名称はカレントのロケールで実行されます。初期状態ではカレントロケールはbaseです。ローカティブf_abc_はその実行時にロケールをabcにスイッチします。動詞18!:4によってもカレントロケールをスイッチすることができます。18!:5は名前を表示します。
名前f_abc_はロケールabcで実行されるという意味は、fで言及されているグローバル名称はそこで探され、もし見つからなければ、次にabcのパス内で探されます(実行はabcで実行されます)ということです。ロケールパスは初期状態では,<,'z'であり、ロケールzは初期には空パスであり、18!:2で変更できます。
ロケールは通常スクリプトが投入されていて、そこではスクリプトを実行するのに使われる動詞の名前が正しく定義されています。たとえば、ファイルstatsに次のスクリプトが含まれているとします。
mean=: sum % # sum=: +/
すると、下記のようなことができます。
ssx_z_=: 0!:10 NB.無声スクリプト実行 ssx_a_ <'stats' NB.ロケールaに'stats'を投入 mean=: 'in base locale' mean_a_ 3 4 5 4 ssx_bc_ <'stats' NB.ロケールbに'stats'を投入 sum_bc_ 3 4 5 12
この例はロケールパスの使い方も示しています。この例ではロケールzになります。最初にユーティリティssxがロケールzで定義されます。ssx_a_の実行に際して、ssxはロケールaにないので、ロケールzで探され見つかります。ssx_a_はロケールaで実行されますので、statsのスクリプトにある名前はロケールa上で定義され、ロケールaに存在することになります。ssx_bc_についても同様です。
付録(appendix)Aの18!:の部分と、システムと一緒に配布されているlabにある“Locales”と“Object Oriented Programming”も参照してください。