APL/J言語:ボックス

Easy Jは少し変な本ですが、いろいろ面白いです。
今回は第5章の「ボックスとレコード」についてです。

   fname=.'Harry'
   sname=.'Potter'
   fpubl=.1998
   shelfcode=.'childrens'
   (

テーブルについて、ボックスにして並べると横にならぶ。

   m=.i.3 4
   (
domain error
(
このようにボックスの足し算はできない。 ;(コロン)でつないでもボックス化できる。
   fname;sname;fpubl;shelfcode
 +-----+------+----+---------+
 |Harry|Potter|1998|childrens|
 +-----+------+----+---------+
ボックス化する動詞<(小なり記号)の逆の>(大なり記号)は、ボックスから中身を取り出し、配列に格納する。
   >fname;sname;shelfcode
Harry    
Potter   
childrens
ボックスは下記のように入れ子にできる。
   rec1=.fname;sname;fpubl;shelfcode
   rec2=.'Jane';'Eyre';1847;'classics'
   (
ラミネート,:(カンマコロン)を使うと縦にボックスをつなげることができる。縦につながったボックスにデータを加えるにはただのアペンド,(カンマ)で加えられる。
   rec3=.'Peter';'Rabbit';'1904';'childrens'
   ds=.(rec1,:rec2),rec3
   ds
 +-----+------+----+---------+
 |Harry|Potter|1998|childrens|
 +-----+------+----+---------+
 |Jane |Eyre  |1847|classics |
 +-----+------+----+---------+
 |Peter|Rabbit|1904|childrens|
 +-----+------+----+---------+
ボックス自体も3x4のリストである。
   #(rec1,:rec2),rec3
3
   $(rec1,:rec2),rec3
3 4
shelfcodeを取り出すためには、いったんトランスポーズ|.(たてぼうドット)してからフロム{(左ブレイス)すればよい。
   scs=.3{|:ds
   scs
 +---------+--------+---------+
 |childrens|classics|childrens|
 +---------+--------+---------+
この中から子供向け'childrens'だけを取り出すには配列を作ってコピーする。
   (scs=<'childrens')#ds
 +-----+------+----+---------+
 |Harry|Potter|1998|childrens|
 +-----+------+----+---------+
 |Peter|Rabbit|1904|childrens|
 +-----+------+----+---------+
姓(surname => sname)のアルファベット順に並べるには昇順ソート/:(スラッシュコロン)を使う。
   /:1{|:ds
1 0 2
この結果で取り出せば目的の並べ替えができる。
   (/:1{|:ds) { ds
 +-----+------+----+---------+
 |Jane |Eyre  |1847|classics |
 +-----+------+----+---------+
 |Harry|Potter|1998|childrens|
 +-----+------+----+---------+
 |Peter|Rabbit|1904|childrens|
 +-----+------+----+---------+