APL IS HAPPY


西川さんの本の3ページ目に

 *******************************
 *                             *
 * APL IS HAPPY APL IS HAPPY A *
 * PL IS HAPPY APL IS HAPPY AP *
 * L IS HAPPY APL IS HAPPY APL *
 *  IS HAPPY APL IS HAPPY APL  *
 * IS HAPPY APL IS HAPPY APL I *
 * S HAPPY APL IS HAPPY APL IS *
 *  HAPPY APL IS HAPPY APL IS  *
 * HAPPY APL IS HAPPY APL IS H *
 * APPY APL IS HAPPY APL IS HA *
 * PPY APL IS HAPPY APL IS HAP *
 * PY APL IS HAPPY APL IS HAPP *
 * Y APL IS HAPPY APL IS HAPPY *
 *                             *
 *******************************

という図があって、その下に次のAPLプログラムがあります。

   C←'APL IS HAPPY  '
   D←12 27ρC
   E←' ',[1](' ',D,' '),[1]' '
   F←'*',[1]('*',E,'*'),[1]'*'

文字列のデータを配列2x27のマトリックスに入れて、周りをスペースとアスタリスクで囲っているのですが、これをJ言語のプログラムに書き換えたのが下記のリストです。

   c =: 'APL IS HAPPY '
   d =: 12 27$c
   e =: ' ',"1 (' ',d,' ') ,"1, ' '
   f =: '*',"1 ('*',e,'*') ,"1, '*'

解説:
'=:'は代入の動詞ですので、一行目で'APL IS HAPPY 'という文字列をcに入れます。HAPPYのあとにワンスペース空いているのがミソでマトリックスに入れて繰り返したときに美しくななめに並びます。
12 27$cの$という動詞は左側に指定された形(配列で指定、今回は12かける27の2次元のマトリックスを指定)に右側の文字列や配列を並べる、不足している場合は繰り返すという意味の動詞です。
3行目、4行目の,(カンマ)という動詞は左右の配列をくっつける意味で1 2 3 , 4 5 6だと1 2 3 4 5 6になります。
"1(ダブルクオートいち)というのは動詞と一緒に使うと、動詞が対象とする次元を変更するもので、通常だとレベルゼロのものを1次元に作用させるものです。今回の場合、左右にスペースやアスタリスクを付与する結果になっています。

以上