APL/J言語:明示的定義

単語構成のところで例に出てきた文は動詞の明示的定義で使われる接続詞:(コロン)と一緒に使うことができる。

   m=: '3 %: y'
   d=: 'x %: y'

   script=: 0 : 0
3 %: y
:
x %: y
)

   roots=: 3 : script
   roots 27 4096
3 16

   4 roots 27 4096
2.27951 8

解説:通常は改行(Enter)で文が実行されますが、名前の定義時にはそれでは困ります。script=: 0 : 0というのはそれ以降)(右かっこ)までの間の各行が改行では実行されずそのままの形で変数(この場合はscript)に蓄えられます。roots=: 3 : scriptというのは動詞rootsの定義という意味で、scriptの内容がrootsの意味になります。scriptという変数を使わず、下記のように書くことも可能です。いずれの場合もxは左側引数、yは右側引数を表します。

   roots=: 3 : 0
3 %: y
:
x %: y
)

副詞や接続詞も明示的に定義することができます。

   table=: 1 : 0
[ by ] over x/   NB.動詞byとoverは第3章より
)
   over=:({.;}.)@":@,
   by=:' '&;@,.@[,.]
  
   2 3 5 ^ table 0 1 2 3
 +-+----------+
 | |0 1  2   3|
 +-+----------+
 |2|1 2  4   8|
 |3|1 3  9  27|
 |5|1 5 25 125|
 +-+----------+

制御構造も使うことができます。

f=: 3 : 0              
if. y<0            
  do. *:y             
  else. %:y           
end.          
)
                 
   f"0 (_4 4)    
16 2                 

   factorial=: 3 : 0
a=. 1
while. y>1
do. a=. a*y
y=.y - 1
end.
a
)
   factorial"0 i. 6
1 1 2 6 24 120

演習:
18.1 関数roots=: 3 : scriptと13 : script(同等である)を実験し、表示せよ。

   NB.roots=: 13 : scriptはわたしの環境ではエラー

18.2 制御構造について調べ動詞の定義に使用してみよ。

   NB.演習としては漠然としすぎ

18.3 下記の副詞dを定義後に、! d b=: i. 7 ,のような表現について実験せよ。
Experiment with expressions such as ! d b=: i.7 , after defining the adverb d :

  d=: 1 : 0
 +:@x
)
   ! d b=: i.7
2 2 4 12 48 240 1440
   +: ! i.7
2 2 4 12 48 240 1440

18.4 演習14.2のpolというプログラムを使い、下記の実験を行い結果について述べよ。

   pol=: +/@([*]^i.@#@[)"1 0   NB.多項式(Polynomial) 
   g=: 11 7 5 3 2 & pol
   e=: 11 0 5 0 2 & pol
   o=: 0 7 0 3 0 & pol
   (g = e + o) b=: i.6
1 1 1 1 1 1
   (e = e@-) b
1 1 1 1 1 1
   (o = -@o@-) b
1 1 1 1 1 1

答え:関数gは関数eとoの合計である。関数eはeven関数(グラフは縦方向に反映される)であり、関数oはodd関数(原点に反映される)である。

18.5 ディクショナリーのパートIIのセクションHを読み、そのスクリプトを明示的定義に用いてみよ。

   NB.省略

18.6 副詞の明示的定義について以下を実行し、上記で定義した関数について用いてみて実験せよ。

   even=: 2 : 0
 -:@(xf. + xf.@-)
)
   ge=: g even
   (e = ge) b
   (e = e even) b

18.7 副詞oddを定義し、下記の実験に私用せよ。

   exp=: ^
   sinh=: 5&o.
   cosh=: 6&o.
   (sinh = exp odd) b
   (sinh = exp .: -) b            The primitive odd adverb .: -
   (cosh = exp even) b
   (exp = exp even + exp odd) b

18.8 以下の実験は複素数を含む。もし複素数について知らない場合は無視せよ。

   sin=: 1&o.
   cos=: 2&o.
   (cos = ^@j. even) b
   (j.@sin = ^@j. odd) b