J言語とは?
以下はJ HOME(http://www.jsoftware.com/)に記されているJ言語のエッセンスを私なりに翻訳したものです。
J is a modern, high-level, general-purpose,
high-performance programming language.
J言語は現代の高レベル、高機能、汎用プログラミング言語です。
J is particularly strong in the
mathematical, statistical, and logical analysis of data. It is a powerful tool
in building new and better solutions to old problems and even better at finding
solutions where the problem is not already well understood.
J言語は特に、数学的、統計的、論理的データ処理・分析に強いパワーを持っています。古い課題を解くための新しい、より良い解決手段を構築したり、まだ解決手段の定まっていない課題の答えを発見するのに助けになるでしょう。
“If you are interested in programming
solutions to challenging data processing problems, then the time you invest in
learning J will be well spent.”
もし、あなたがデータ処理を伴う未知の課題を解くためのプログラム開発に興味があるのでしたら、J言語を習得するために費やす時間は十分価値あるものであり、決して無駄にはならないでしょう。
J言語のためのクイックレファレンス (JAPLA 1998)
「日本APL協会」 J言語研究会編
目次
はじめに
第0章 J言語の特徴超入門
第1章 数値計算の概要
1.1 基本的な数学演算
1.2 マイナスと無限大
1.3 円関数
1.4 複素数の計算
1.5 マトリックスの計算
1.6 乱数と素数
1.7 微分、テイラー展開、多項式
1.8 階乗と置換
1.9 接続詞の「..」と「.:」
第2章 論理演算とブール代数
2.1 論理演算
2.2 ブール代数
2.3 n進化と10進化
第3章 アレイの形の各種の変形
3.1 アレイの形と変形
3.2 ランク
3.3 取りと落とし
3.4 修正
3.5 逆順、回転とソート
3.6 データの融合
3.7 ボックスによる囲みとほぐし
3.8 区切り(Cut)と斜め(Oblique)
第4章 関数の合成
4.1 接続詞の「&」と「@」
4.2 副詞のチルド「~」
4.3 フォークとフック
4.4 ジェランドとコントロール機能
第5章 制御構文と関数の定義
5.1 明示的定義
5.2 制御構文
5.3 定義と引数制御用の名詞・副詞・接続詞
5.4 数値と文字の相互変換
5.5 名詞の生成
5.6 ユーティリティ
第6章 外部接続詞
第1章 数値計算の概要
1.1基本的な数学演算
用法 |
機能、(例)(1項) |
用法 |
機能、(例)(2項) |
+ Conjugate 共役 + y |
実数の範囲内ではそのまま 複素数では共役 実部が同じで虚部は符号が逆 |
Plus 加算 x + y |
左引数と右引数の和 |
- Negate 逆符号 - y |
右引数の符号を反対にする 複素数は実部と虚部符号を逆にする |
Minus 減算 x - y |
左引数から右引数を引く 複素数どうしの引き算も可能 |
* Signum 符号 * y |
実数に対しては、正には1、0には0、負には−1を付与 複素数に対しては大きさが1で同じ偏角の複素数 |
Times 乗算 x * y |
左引数と右引数との積 複素数どうしの乗算も可能 |
% Reciprocal 逆数 % y |
1 % y と同じ 複素数の逆数は大きさが逆数で偏角が反対符号になる |
Devide-by 除算 x % y |
左引数を右引数で割る 複素数どうしの割り算も可能 |
| Magnitude 絶対値 | y |
符号を取って絶対値にする 複素数に対しては大きさ |
Residue 剰余 x | y |
右引数を左引数で割った時のあまり |
+: Double 2倍 +: y |
右引数の要素を2倍する |
Not-or 否定論理和 x +: y |
左右の引数が共に0の時1、そうでなければ0 |
- Halve 2分の1 -: y |
右引数の要素を半分にする |
Match 一致 x -: y |
(2.1)を参照 |
*: Square 平方 *: y |
右引数の要素を平方する |
Not-and 否定論理積 x *: y |
左右の引数が共に1の時0、そうでなければ1 |
%: Square root 平方根 %: y |
右引数の要素の平方根をとる 負の値の時は虚数になる |
Root 累乗根 x %: y |
YのX乗根 y ^ % x に等しい -1 乗根は逆数に等しい |
^ Exponential 指数 ^ y |
eのY乗 |
Power 累乗 x ^ y |
xをY乗する |
^. Natural-log 自然対数 ^. y |
底がeの対数(自然対数) |
Log 対数 x ^. y |
Xを底とするYの対数 |
>: Increment 1増 >: y |
右要素に1を加える |
Larger or equal 大きいか等しい x >: y |
左引数が右引数より大きいか等しければ1、そうでなければ0 |
<: Decrement 1減 <: y |
右要素から1を引く |
Lesser or equal x <: y |
左引数が右引数より小さいか等しければ1、そうでなければ0 |
>. Ceiling 天井値 >. y |
Yより大きな最小の整数 |
Larger of 大きい方 x >. y |
左引数と右引数の大きい方を選ぶ |
<. Floor 床値 <. y |
Yを超えない最大の整数 |
Lesser of 小さい方 x <. y |
左引数と右引数の小さい方を選ぶ |
1.2 マイナス、無限大
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
_ Negative-sign マイナス Infinity 無限大 |
アンダーバーです。 数学のマイナス記号 負の整数マイナス1は _1 となる 単独では無限大 2 % 0 _ |
|
なし |
_. Indeterminate 不定 |
無限大の演算で生じる不定形を表す _ - _ _. |
|
なし |
_: Infinity 無限大 |
無限大の定数を生じさせる _: 1 2 3 _ 右引数の指定したランクに対応した形の無限大を派生 (_:"0)i.2 3 _ _ _ _ _ _ (_:"1)i.2 3 _ _ |
|
なし |
1.3 円関数
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
o. Pi-times 円周率倍 o. y |
円周率πとyの積 yπ |
Circular function 円周率 x o. y |
左引数で円周率の型を指定する 角度はラジアンで与える 1 o. y は sin y 2 o. y は cos y 3 o. y は tan y _1 o. y は arcsin y _2 o. y は arccos y _3 o. y は arctan y 他にもあるが、ここでは割愛 |
1.4 複素数の計算
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
+ |
(1.1)に記載済み |
+ |
(1.1)に記載済み |
- |
(1.1)に記載済み |
- |
(1.1)に記載済み |
* |
(1.1)に記載済み |
* |
(1.1)に記載済み |
% |
(1.1)に記載済み |
% |
(1.1)に記載済み |
| |
(1.1)に記載済み |
| |
(1.1)に記載済み |
+. Real/Imaginary 実部/虚部 +. y |
複素数の実部と虚部を取り出す |
GCD(Or) 最大公約数 (論理和) x +. y |
左右の引数が共に0のとき0、そうでなければ1 |
*. Length/angle 長さ/偏角 *. y |
複素数の大きさと偏角を取り出す |
LCM(And) 最小公倍数 (論理積) x *. y |
左右の引数が共に1のとき1、そうでなければ0 |
j. Imaginary 虚数生成 j. y |
0j1*yと同じ j. yはyを複素平面上で90度回転する |
Complex 複素数生成 x j. y |
x + j. y と同じ 3 j. 4 3j4 |
r. Angle 単位複素数 r. y |
^0j1*yに同じ (私には理解できません) |
Polar 極座標表示 x r. y |
x*^0j1*y に同じ (私には理解できません) |
n.5 マトリックスの計算
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
u .v Determinant 一般行列式 |
-/ .* は正則行列の行列式 +/ .* はパーマネント (私には理解できません) |
Dot product 一般内積 |
x +/ .* y は内積 u vとしてはいろいろな関数(動詞)を適用することも可能 |
%. Matric Inverse 一般逆行列 %. y |
行数が列数と等しいかより大きい行列の一般逆行列を与える (私には理解できません) |
Matrix Divide 行列の割り算 x %. y |
xがベクトルでYがxの次数に等しい正則行列ならば連立方程式の解を与える。また、yの行数が列数より大きいときは、最小2乗解。 |
/ Insert (副詞) |
|
Table 一般外積 x u/ y |
x */ y はxとyの外積 uとしては他の関数(動詞)を適用することも可能 |
128!: QR分解 |
128!:0はQR分解 128!:1はyを上三角行列に変換する |
|
なし |
1.6 乱数と素数
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
? Roll 乱数 ? y |
0からy−1までの整数乱数を生成する 9!:1はランダムシードをセットする |
Deal 非重複乱数 x ? y |
重複をゆるさず 1からy−1までのx個の整数乱数を生成する |
?. Roll 乱数 ?. y |
シードを固定して乱数を発生する |
Deal 非重複乱数 x ? y |
重複をゆるさず 1からy−1までのx個の整数乱数を生成する シード固定 |
p: Primes 素数 p: y |
右引数で指定した順位の素数を与える |
|
なし |
q: Prime factor 素因数分解 p: y |
右引数の整数の素因数分解 |
Prime Exponents 素数の位置 x p: y |
素因数分解した素数の位置と個数を与える |
1.7 微分、テイラー展開、多項式 (著者の能力を超えるため記載できません)
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
d. |
|
d. |
|
D. |
|
D. |
|
D: |
|
D: |
|
T. |
|
T. |
|
t. |
|
t. |
|
t: |
|
t: |
|
p. |
|
p. |
|
1.8 階乗と置換
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
! Factorial 階乗 ! y |
1,2,3,...,yまでの積 整数値以外でも可能 |
Out-of 2項係数 x ! y |
y個の中からx個取り出す組み合わせ総数 |
A. Anagram index |
数列や文字列の置換のインデックスを与える (よく分かりません) |
Anagram 辞書式順序 |
xで与えたインデックスに対応するyの置換を与える (よく分かりません) |
C. Cycle direct C. y |
並べ替えの指標を与える (よく分かりません) |
Permute x C. y |
xで与えた指標にしたがってyを並べ替える 1 0 3 2 C. 1 2 3 4 2 1 4 3 |
1.9 接続詞の「..」と「.:」(著者の能力を超えるため記載できません)
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
.. |
|
.. |
|
.: |
|
.: |
|
第2章 論理演算とブール代数
2.1 論理演算
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
-: Halve 2分の1 |
(1.1に記載済み) |
-: Match 一致 x -: y |
左引数と右引数とがマッチしていれば1、そうでなければ0 |
~. Nub 重複排除 ~. y |
yの重複要素を排除する |
|
なし |
~: Nubsieve 重複指示 ~: |
(よく分かりません) |
Not Equal 不等 x ~: y |
xとyが等しければ0、そうでなければ1 |
= Self Classify 自己分類 = y |
重複を分類して判別し、1で重複、0で非重複を表示する |
Equal 等しい x = y |
xとyが等しければ1、そうでなければ0 |
e. Raze(in) 部分所属 e. y |
yの各要素を照合してブール数で表示する |
Member (in) 要素の所属 x e. y |
左引数の要素が右引数の中に含まれていれば1、そうでなければ0 |
E. |
なし |
E. Member of interval パターンの所属 x E. y |
右引数の中に左引数のパターンが含まれていれば、始まる位置に1を返す、そうでなければ0を返す 'co' E. 'cocoa' 1 0 1 0 0 |
i. Integers 整数 |
(3.1に記述) |
i. Index of first インデックス x i. y |
右引数の要素の左引数における最初の位置を返す 1 2 3 3 2 i. 3 2 2 1 |
|
なし |
i: Index of Last インデックス x i: y |
右引数の要素の左引数における最後の位置を返す 1 2 3 3 2 i: 3 2 3 4 |
< Box ボックス < y |
(3.7に記述) |
< Less than より小さい x < y |
左引数が右引数より小さければ1、そうでなければ0 |
> Open > y |
(3.7に記述) |
> Larger than x > y |
左引数が右引数より大きければ1、そうでなければ0 |
<: Decrement 1減 <: y |
(1.1に記述) |
<: Lesser or equal 小さいか等しい x <: y |
左引数が右引数より小さいか等しければ1、そうでなければ0 |
>: Increment 1増 >: y |
(1.1に記述) |
>: Larger or equal 大きいか等しい x >: y |
左引数が右引数より大きいか等しければ1、そうでなければ0 |
2.2 ブール代数
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
*. Length/Angle *. y |
複素数関連 1.4に記載済み |
LCM(And) 最小公倍数 (論理積) x *. y |
左右の引数が共に1のとき1、そうでなければ0 |
+. Real/Imaginary 実部/虚部 +. y |
複素数の実部と虚部を取り出す |
GCD(Or) 最大公約数 (論理和) x +. y |
左右の引数が共に0のとき0、そうでなければ1 |
*: Square 平方 *: y |
右引数の要素を平方する |
Not-and 否定論理積 x *: y |
左右の引数が共に1の時0、そうでなければ1 |
*: Square 平方 *: y |
右引数の要素を平方する |
Not-and 否定論理積 x *: y |
左右の引数が共に1の時0、そうでなければ1 |
-. (Not) 否定・補数 -. y |
右引数が1なら0、0なら1 |
Less x -. y |
左引数から右引数の要素を除いたもの 1 2 3 4 -. 2 3 1 4 |
b. (副詞) Basic characteristic u b. n |
u b. 0 はランクを表示する u b. _1 は逆関数を表示する u b. 1 は identity function uは任意の関数(動詞) |
Boolean x b. y |
整数をブール数に変換する (よく分かりません) |
2.3 n進化と10進化
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
#. Base-2 2進数 #. y |
2進数で与えた右引数を10進数に変換する |
Base 10進化 x #. y |
左引数を底の加重合計値 10 #. 1 2 3 123 60 #. 1 30 20 5420 一時間30分20秒の秒数 |
#: Antibase 2 10進数の2進化 #: y |
10進数で与えた右引数を2進化する #: 5 1 0 1 |
n進化 x #: y |
10進数で与えた右引数の左引数の底による進数表示 24 60 60#:5420 1 30 20 秒を時分秒に変換 |
第3章 アレイの各種の変形
3.1 アレイの形と変形
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
i. Integer 整数生成 i. y |
0からy−1までの整数を生成する 負の整数なら降順の整数列 テーブルの形でも可能 i. 4 0 1 2 3 i. _4 3 2 1 0 i. 2 3 0 1 2 3 4 5 |
i. Index of first インデックス x i. y |
右引数の要素の左引数における最初の位置を返す 1 2 3 3 2 i. 3 2 2 1 |
$ shape of 形 $ y |
yの各ランクの要素数を返す |
Reshape 変形 x $ y |
xの形にyを変形する |
# Tally アイテム数 # y |
アイテム(引数より1つランクの低いセル)の数 |
# Copy 複写 |
3.3に記述 |
, Ravel リスト化 , y |
右引数をリストに変形する , I. 2 3 0 1 2 3 4 5 アトムもリストに変形される $ , 3 1 |
Append 連結 x , y |
右引数を左引数の最大ランクの方向に連結する。左引数がリストなら横に、テーブルなら下に連結する。要素数が不足なら0が付加される。 |
,. Ravel Items テーブル化 ,. y |
左引数をテーブル化する |
,. Stitch 縦連結 x ,. y |
,.yとxを,で連結したものと同じ |
,: Itemize アイテム化 ,: y |
ランクを1つ増やした高次のアレイを作る |
Laminate 層連結 x ,: y |
セルを重ねて、1つ高いランクになるように連結する |
3.2 ランク
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
" Rank ランク u"n y |
動詞(u)の作用するランクセルのナンバーを指定する ランク1は行、2は列 |
ランク x u"n y |
|
3.3 取りと落し
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
# Tally アイテム数 # y |
アイテム(引数より1つランクの低いセル)の数 |
# Copy 複写 x # y |
右引数を左引数で指定した数だけコピーする |
{ Catalog カタログ |
ボックスで与えられた要素の全ての組み合わせを与える |
From 選択 x { y |
左引数で指定したアイテムを取り出す 0 { 1 2 3 4 1 2 3 { 1 2 3 4 3 4 a =. i. 4 5 a 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 { a 0 1 2 3 4 ランク1を指定すると列を取り出す 0 {"1 a 0 5 10 15 ブロックで取り出す時は2重ボックスで指定する (<2 3;3 4){a 13 14 18 19 |
{. Head 先頭取り {. y |
右引数の先頭アイテムの取り出し |
Take 取り x {. y |
xが正整数の時はyの先頭から、負なら末尾からxの絶対値の個数のアイテムを取り出す |
}. Behead 先頭落とし {. y |
右引数の先頭アイテムを落とす |
Drop 落とし x }. y |
xが正整数の時はyの先頭から、負なら末尾からxの絶対値の個数のアイテムを落とす |
{: Tail 末尾取り {: y |
右引数の最終アイテムの取り |
|
なし |
}: Curtail 末尾落とし }: y |
右引数の最終アイテムを落とす |
|
なし |
3.4 修正
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
} Item Amend アイテム修正 m } y |
mで指定したyの各アイテムに変更したものを表示する a=.2 5$'abcdefghij' a abcde fghij 1 0 1 0 1 } a fbhdj |
Amend 修正 x m } y |
インデックスmでしてしたyの要素をxに変更して表示する 要素の変更はボックスで指定する a =. 30 b =. i. 2 5 b 0 1 2 3 4 5 6 7 8 9 1行3列のデータ7を30に変更するには インデックスをボックスで指定する a (<1 2)} b 0 1 2 3 4 5 6 30 8 9 |
3.5 逆順、回転とソート
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
|. Reverse 逆順 |. y |
アイテムを逆順にする |
Rotate 回転 x |. y |
右引数のアイテムをx個だけ回転する。xが負なら後ろから回転する。 |
|: Transpose 転置 |: y |
右引数のセルを転置させる。 |
Transpose 転置 x |: y |
xで指定した軸が最も若い軸(0軸)になるように転置する。 |
/: Grade-up 昇順 /: y |
yを昇順に並べるインデックスを出力する |
Sort 昇順ソート x /: y |
xをyで与えた指標にしたがって並べ替える。 |
\: Grade-down 降順 \: y |
yを降順に並べるインデックスを出力する |
Sort 降順ソート x \: y |
xをyで与えた指標にしたがって並べ替える。 |
3.6 データの融合 (/以外は著者の能力を超えるため記載できません)
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
/ Insert 挿入 u/y |
アイテムの間に動詞(u)を挿入した演算と同等 |
Table 一般外積 (1.5)に記述 |
|
\ |
|
\ |
|
\. |
|
\. |
|
3.7 ボックスによる囲みとほぐし
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
< Box <y |
左引数をボックスで囲む |
Less than (2.1)に記述 |
|
> Open >y |
ボックスを開く |
Larger than (2.1)に記述 |
|
; Raze ほぐし ;y |
主軸にそって右引数をほぐす |
Link 融合 x;y |
左右の引数をボックスの形で結合する |
L. Level L.y |
右引数のボックスのレベルの深さを与える |
|
なし |
|
なし |
L: 副詞 u L:n y |
動詞uをL:n というレベルのボックス内で演算する |
{:: Map {::y |
ボックスへのパスを表示する |
Fetch x {:: y |
左引数で与えた指標に従い右引数のサブアレイの要素を取り出す |
3.8 区切り(Cut)と斜め(Oblique)(著者の能力を超えるため記載できません)
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
;. |
|
;. |
|
3.9 その他 (著者の能力を超えるため記載できません)
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
;. |
|
;. |
|
/. |
|
/. |
|
4章 関数の合成
4.1 接続詞の「&」と「@」(著者の能力を超えるため記載できません)
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
& |
|
& |
|
&. |
|
&. |
|
&: |
|
&: |
|
@ |
|
@ |
|
@: |
|
@: |
|
4.2 副詞のチルド「~」(著者の能力を超えるため記載できません)
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
~ |
|
|
|
~ |
|
|
|
4.3 フォークとフック(著者の能力を超えるため記載できません)
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
Fork |
|
|
|
Hook |
|
|
|
[: |
|
|
|
4.4 ジェランドとコントロール機能(著者の能力を超えるため記載できません)
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
` |
|
|
|
`: |
|
|
|
$: |
|
|
|
@. |
|
|
|
^: |
|
|
|
:: |
|
|
|
第5章 制御構文・システム関数・ユーティリティ
5.1 明示的定義
foo =. 4 :0 二項動詞 foo =. 3 :0 単項動詞 定義の仕方は本文に記載 |
5.2 制御構文
if. A do. B end. Aが0でない(真の)時、Bを実行。 if. A do. B1 else. B2 end. if. A do. B1 elseif. C1 do. B2 elseif. C2 do. B3 end. while. A do. B end. Aが0である限りBを実行する。 whilst. A do. B end. まずBを実行し、Aが0でない限りBを実行する。 try. B1 catch. B2 end. B1を実行しエラーがあればB2を実行する。 for. B1 do. B2 end. B1の回数だけB2を実行する。 select. Y case. 1 do. D1 case. 2 do. D2 case. 3 do. D3 end. Y =. 1, 2, 3に応じD1,2,3を実行する。 break. while(whilst)から抜け出す continue. while(whilst)を続ける goto_name. ラベル'name'へジャンプする return. 構文の流れから抜け出す |
5.3 定数と引数の制限用名詞・副詞・接続詞
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
=. =: |
なし |
=. =: Copula (is) x =. y x =: y |
=.は局所定義 =:は大局定義 |
[(]) 同等 [y |
内容表示 |
left/right 左引用 右引用 |
[は左引数を取り出す ]は右引数を取り出す |
[. |
記述割愛 |
|
|
]: identiry |
記述割愛 |
|
|
: modad/dyad |
記述割愛 |
|
|
5.4 数値と文字の変換
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
;: Word Formation ;:y |
文字列をボックスで区切る |
|
なし |
": Default Format デフォルト書式 |
数値で与えた右引数を文字化する |
Format 書式 x ": y |
書式を整え文字化する 5.2 ": 12.5 (j5.04b) 12.50 5j2 ": 12.5 (j6.01b) 12.50 |
". Do 実行 ". y |
文字列で与えた右引数を数値化して実行する |
Numbers x ". y |
yを数値化したときに欠けた部分をxで補う |
5.5 名詞の生成
演算結果表示の優先は、複素数、不動小数点、分数、拡張整数、整数、ブール数の順。
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
ad ar |
ad Degreeによる複素数表示 ar Radianによる複素数表示 |
b |
左に進数の値、右にその進数での値を置いたときの10進数の値 |
e |
十進数の桁数表示 |
j |
複素数表示 |
p |
π mpn はmπのn乗 1p1 3.14159 2p1 6.28319 |
r |
有理数の分数表示 2r3 0.666667 |
x |
mxnはmeのn乗 1x1 2.71828 |
x(末尾) |
長い実数表示を指定する a=.12345678912345x a 12345678912345 a=.12345678912345 a 1.23457e13 |
x: Extended Precision 拡張精度 |
分数表示の実数の拡張表現 |
a. アルファベット |
256のキャラクタ、アスキー文字 |
a: Ace |
空のボックスリスト |
NB. Nota Bene |
コメント |
5.6 ユーティリティ(著者の能力を超えるため記載できません)
用法 |
機能、例(1項) |
用法 |
機能、例(2項) |
|
|
|
|
|
|
|
|
第6章 外部接続詞
Jでは外部接続詞により、いろいろなシステム関数を提供している。使いやすい名前を付してプロファイルファイルに登録しておくと便利である。むろん、ダイレクトでも構わず、プログラム内でも使用できる。
用法 |
機能、例(1項) |
0 Script |
0!:3 <'script.txt' 'script.txt'を読み込む(内容は非表示) |
1 File |
|
J言語の講義 (須田)
まずはお決まりの hello world です。
課題1 画面に hello world と表示する。
まず、Jを起動して最初に出てくるのが1.jtxという名前のウイン
ドウです。これは、実行ウインドウです。基本はインタープリタで、ここに入力されたコマンドが解釈されて、同じウインドウに結果が表示されます。プロンプ
ト文字はありません。入力を促すプロンプト文字の代わりに、カーソル位置が左端から4文字目の位置で点滅します。
結果は左端から表示されます。
J言語はインタープリタ型言語です。BASIC言語と同じです。C,PASCALはコンパイラ型言語で、ソースをコンパイルして実行ファイルを作って、それを実行して結果を得るという使い方をします。
この実行画面で次のように入力します。
hello world
すると、下のように表示されます。これは、J言語特有のボックス表示というもので、その意味は、私も完全に理解していないので、今は無視します。
┌─────┬─────┐
│hello │world │
└─────┴─────┘
次に、シングルクォーテーションで囲んで、以下のように入力します。
'hello world'
すると、今度は、課題が求めているとおり、表示します。
hello world
BASCIなら
PRINT "hello world"
perlなら
#!/usr/bin/perl
print "hello world",\n
というソースを作って hello.pl という名前で保存して
perl hello.pl
で実行します。
インタープリタは手間がかからないという利点があります。
課題2 'hello world'の文字数を求める。
目で数えると、間にスペースがあるので、11文字です。
J言語での求め方は、
第3章 アレイの形の各種の変形
3.1 アレイの形と変形
に用意されているコマンドを使います。ここに、形 shape of というコマンドがあります。記号は $
です。
これを使うと 引数の形を報告してきます。
$ 'hello world'
11
ここで、変数への代入を説明します。
変数はアルファベットで任意に作れます。
まず、a と入力すると、定義されていないので、エラーが戻ります。
a
|value error: a
まだ、aは使われていないので、
a =. 'hello world'
と代入すると、
a
hello world
で代入されたのが分かります。
代入は =. という書式を使います。
BASICでは代入は a = " hello world" でした。
代入してから
$ a
という具合に入力すれば、
11
と同じ結果が戻ります。
復習です。
=========
J言語はインタプリタ言語です。
変数への代入は =. を使います。
引数の形を $ で調べることが出来ます。
=========
今回はファイルアクセスについて説明します。
その前に、別のウインドウの説明をします。実行ウインドウのメニューFILEからNew
ijs を選んで、ウインドウを開きます。これは、スクリプトウインドウというもので、ここに入力しても実行はされません。作業場として使え、記録として残すことも出来ます。部分を実行ウインドウで実行させることも可能です。
終わったら保存しておけば、再利用が可能です。
以下にFile関連の使い方を記します。
ファイル処理関係の例として、外部接続詞から私が定義したツールを示します。
作ったコマンドは
pwd これはUNIX流、print working directory
dir これはDOSでお馴染みの ディレクトリチェック用
cd これも同上で チェンジディレクトリです。
read_from_file
write_to_file
です。
コマンドを作るということは関数を定義するということと同じです。関数は引数が必要です。J言語では引数は1つ、または、2つ持つことが出来ます。引数は関数記号の前、または後ろに置かれます。関数定義の内部では、前の引数は x
後ろの引数は y で参照されます。
J言語では
第5章 制御構文と関数の定義
5.1 明示的定義
に関数定義のスペックがあります。
関数は引数の数で定義の仕方が異なります。
NB. directory check
dir =:3 :0
1!:0 <y
)
NB.read one line string file
read_from_file =:3 :0
1!:1 <y
)
NB.write string data x to y file
write_to_file =:4 :0
x 1!:2 <y
)
この3つの例で示します。
NB.は注釈行であることを示します。NB. とは nota bene というラテン語のようです。
Main Entry: nota bene
Etymology: Latin, mark well
-- used to call attention to something
important
引数が一つの関数は =:3 :0 で 2つの関数は =:4 :0 で定義します。
数字の3と4の後ろのスペースは必須です。
NB. directory check
dir =:3 :0
1!:0 <y
)
これは、dir というコマンドを定義しています。引数は一つ。コマンドの内容は1!:0
<y
です。
1!:0 というのが、ディレクトリを取得するというビルトインコマンドです。このような記号で定義されているので、そのまま受け入れるしかありません。
<y
ここでyは引数です。その前の < はビルトインコマンドで、
引数をボックス処理(ここは、先にも記しましたが、私、よく理解できてません。こうしないといけないのだということで、受け入れるしかありません。)する
コマンドです。この状態て、ディレクトリが取得され、結果は、ボックス状態で返されます。
最後の
)
は、関数定義の終了を示す記号です。
NB.read from file
read_from_file =:3 :0
1!:1 <y
)
これは、ファイルからデータを全部読み込むコマンドです。引数はファイル名で、一つですので、=:3 :0 で定義されています。
!1:1 これが、ファイル読み込みのビルトインコマンドです。
NB.write string data x to y file
write_to_file =:4 :0
x 1!:2 <y
)
これは、左引数 x を 右引数 y で指定されるファイルに保存するコマンドです。
引数が2つですので =:4 :0 で定義します。
x !!:2 <y
がファイルへの書き込みビルトインコマンドです。
ファイル名はボックス処理されています。
以下のテキストをスクリプトウインドウへペーストして下さい。
NB. pwd print working directory
pwd =:3 :0
1!:43''
)
NB. cd change directory
cd =:3 :0
1!:44 y
)
NB.read one line string file
read_from_file =:3 :0
1!:1 <y
)
NB. read from file same as above
rff =:3 :0
1!:1 <y
)
NB.write string data x to y file
write_to_file =:4 :0
x 1!:2 <y
)
wtf =.4 :0
x 1!:2 <y
)
NB. directory check
dir =:3 :0
1!:0 <y
)
そして、このウインドウのメニューのRUN window を選んでください。この内容が実行ウインドウで実行されます。
load 'c:\j601\temp\1.ijs'
と表示されます。
ここで、
pwd 0
と入力すると、現在のディレクトリが表示されます。
c:\j601
dir '*.ijs'
で、IJSファイルが表示されます。ボックス表示で表示されます。
これまでの復習です。
==================================
関数の定義は引数の数の違い(1つか2つ)で定義式が異なります
一つの時は =:3 :0 2つの時には =:4 :0 で定義します。引数は関数の前後に置き、1つの時は、後ろに置き、関数内部では y で参照します。2つの時は2つ目を関数の前に置き、内部では x
で参照します。
==================================
前の講義では、2つの引数を持つ関数の説明をしないでしまいましたので、ここでやります。
NB.write string data x to y file
write_to_file =:4 :0
x 1!:2 <y
)
これです。
ファイルへ書き込むビルトインコマンドが 1!:2 で 前後に引数を要求する仕様になっています。 左にデータ、右にファイル名を指定する必要があります。
書き込むファイル名は 'test.txt' とし、書き込むデータは 先に定義した aとします。
そうすると、
a write_to_file 'test.txt'
と入力すると、カーソルはプロンプト位置に戻ります。
直接
確かに書き込まれたかどうか、
dir 'test.txt'
┌────┬──────────┬─┬──┬───┐
│test.txt│2006 11 23 12 26 23 │11│rw-
│-----a│
└────┴──────────┴─┴──┴───┘
となり、しっかり保存されていることが分かります。ついでに、これを読み込んでみましょう。
b
|value error: b
bは未定義の変数です。
b=. read_from_file 'test.txt'
これで、bにファイルの内容を取り込みます。
b
hello world
しっかり、読み込んでいます。
追記)
今回は、馴染みのない記号で定義されているビルトイン機能を分かりやすい言葉に置き換えただけの定義を例示しました。
a 1!:2 <'test.txt' としても同じ結果になります。
ここで、追加情報付き復習を。
===
ファイルアクセスについて
第6章 外部接続詞
にある、ビルトインコマンドを使って、読み書きします。
1!:0 y でディレクトリチェック yはボックス化ファイル名
1!:1 y で全部読み込み yはボックス化ファイル名
x 1!:2 y でxをyに書き込み yはボックス化ファイル名
x 1!:3 y でxをyに追加書き込み これは、前のセクションでは抜けてました
yはボックス化ファイル名
1!:4 y でyのサイズチェック yはボックス化ファイル名
1!:5 y でディレクトリ作成 yはボックス化した名前
1!:55 y でファイル削除 yはボックス化ファイル名
以下はインデックスによる読み書き ランダムアクセスです。
1!:21 y でファイルオープン yはボックス化ファイル名
1!:11 y オフセットと、読み込み文字数を指定して読み込み
y は ファイル番号、オフセット、文字数のベクトル
ファイル番号は 1!:21 y で返されるシステム依存の番号です
x 1!:12 y オフセットとを指定しての書き込み
y は ファイル番号とオフセットのボックス化ベクトル
1!:22 y でファイルクローズ
yはファイル番号で 1!:21 y で返されるシステム依存の番号です
ほかにもありますが、私は使っていないので省略。これでとりあえず十分です。
===
ボックス化というのは 記号 < で実現します。 <'a_file_name'という具合です。なぜ、こうなのかは、分かりません。仕様ですから、従うしかありません。
ファイル関係の関数をまとめてみます。新たに追加したものも含めてまとめました。
以下のスクリプトをスクリプトウインドウにペーストしてRUN->WINDOWで実行ウインドウにロードして、いろいろ試してください。
インデックス式読み書きは次回にします。
NB. pwd print working directory
pwd =:3 :0
1!:43''
)
NB. cd change directory
cd =:3 :0
1!:44 y
)
NB.read one line string file
read_from_file =:3 :0
1!:1 <y
)
NB. read from file same as above
rff =:3 :0
1!:1 <y
)
NB.write string data x to y file
write_to_file =:4 :0
x 1!:2 <y
)
wtf =.4 :0
x 1!:2 <y
)
NB. directory check
dir =:3 :0
1!:0 <y
)
NB. append
append_data =:4 :0
x 1!:3 <y
)
NB. file size
file_size =:3 :0
1!:4 <y
)
NB. creat directory
mkdir =:3 :0
1!:5 <y
)
NB. delete file
delete_file =:3 :0
1!:55 <y
)
復習を少し。
前回はファイル読み書きについて、一括読み込み、書き込み、追加書き込みを説明しました。
少し、実験してみましょう。今回コマンドはキーインを簡単にするために省略形も定義しました。
以下をスクリプトウインドウにペーストして RUN->windwoで実行ウインドウへロードします。
===
NB. pwd print working directory
pwd =:3 :0
1!:43''
)
NB. cd change directory
cd =:3 :0
1!:44 y
)
NB.read one line string file
read_from_file =:3 :0
1!:1 <y
)
NB. read from file same as above
rff =:3 :0
1!:1 <y
)
NB.write string data x to y file
write_to_file =:4 :0
x 1!:2 <y
)
wtf =:4 :0
x 1!:2 <y
)
NB. directory check
dir =:3 :0
1!:0 <y
)
NB. append
append_data =:4 :0
x 1!:3 <y
)
apd =:4 :0
x 1!:3 <y
)
NB. file size
file_size =:3 :0
1!:4 <y
)
fsz =:3 :0
1!:4 <y
)
NB. creat directory
mkdir =:3 :0
1!:5 <y
)
NB. delete file
delete_file =:3 :0
1!:55 <y
)
rm =:3 :0
1!:55 <y
)
===
実際に試して見ましょう。
a
hello world
aにhello world が定義されています。
write_to_file --> wtf
a wtf 'test2.txt'
dir 'test2.txt'
test2.txt 2006 11 23 21 42 38 11 rw- -----a
file_size --> fsz
fsz 'test2.txt'
11
read_from_file --> rff
rff 'test2.txt'
hello world
append_data --> apd
a apd 'test2.txt'
rff 'test2.txt'
hello worldhello world
ここで注目! アペンドしたファイルには改行コードがありません。(説明は次回に行います。)
delete_file -->rm (unixのrm remove)
rm 'test2.txt'
1
dir 'test2.txt'
削除されると何も出力されません。
さて、次はいよいよランダムアクセスです。
ファイルアクセスはJ言語では作業用ワークスペースと外部とのデータ通信のための必須のアイテムで、特にランダムアクセス、J言語ではインデックス式ファイルアクセスと言いますが、これを、使いこなすと、処理データサイズの制限はハードディスクのみに依存という状態になります。
では、インデックス式ファイルアクセスの関数を作ってみます。これまでは、基本関数を分かりやすくアルファベットに置き換えるだけの定義でしたが、今回は少し複雑になります。
まず、読み出しです。
====
NB. indexed_read y: offset, length vector
x:filename
indexed_read =:4 :0
a_file =. x NB. assign filename from x
offset =. 0{y NB. get first item from y as offset
length =. 1{y NB. get second item from y as length
filenumber =. 1!:21 <a_file NB. open the
file
a_data =. 1!:11 filenumber,offset,length
NB. indexed read
1!:22 filenumber NB. close the file
a_data NB. return the data read
)
====
関数名は indexed_read です。2つの引数をとるので=:4 :0 で定義します。
x は左引数でアクセスするファイル名を指定します。
y は右引数でオフセットと読み込むバイト数をベクトルで指定します。
a_file =. x NB. assign filename from x
これは、関数内部で アクセスするファイル名を a_file に代入しています。
offset =. 0{y NB. get first item from y as offset
length =. 1{y NB. get second item from y as length
ここで、オフセットと長さがそれぞれ、offset, length に代入されています。
0{y について説明します。 { は
第3章 アレイの形の各種の変形
3.1 アレイの形と変形
の中でビルトインされている関数で from 選択 関数です。 右引数からその要素を取り出す関数で、左から数えます。
0 { y で、yの要素の一番目を選び出します。
1 { y で、yの要素の2番目を選び出します。
この場合、yにはオフセットと長さがベクトルで与えられていますので、先頭要素をオフセット、2番目の要素を長さとして選び出し、関数内部の変数に代入しています。
そして、
filenumber =. 1!:21 <a_file NB. open the
file
ファイルをオープンしてファイル番号を求め、代入します。
a_data =. 1!:11 filenumber,offset,length
NB. indexed read
これで a_data にファイル名、オフセット、長さで指定されたデータがバイト列として読み出されます。
仕様により、これら3つの情報はベクトルで与えます。 filenumber offset
length の間の , は ベクトル連結の基本関数です。
1!:22 filenumber NB. close the file
これでファイルを閉じます。
最後に
a_data NB. return the data read
で結果を評価し、これが、関数の値として返されます。
次は書き込みです。
====
NB. indexed_write y: boxed vector of
filename and offset x: data to be
written
indexed_write =:4 :0
a_file =. >0{y NB. get first boxed item from y and open box as filename
offset =. >1{y NB. get second boxed item from y and open as offset
filenumber =. 1!:21 <a_file NB. open the
file
x 1!:12 filenumber;offset NB. indexed write
boxed vector of filenumber and offset
1!:22 filenumber NB. close the file
)
====
以下、解説です。
NB. indexed_write y: boxed vector of
filename and offset x: data to be
written
indexed_write =:4 :0
関数名は indexed_write とします。書き込むデータ(文字列、バイト列)をx
として左引数で与えます。ファイル名とオフセットはボックス化ベクトルで右引数 y で与えます。
ここでも 選択関数 { を使います。
読み込みの時と違って、 > がついています。これは ボックスを取り除く関数です。関数は右から適用されます。 まず、yの左端の要素を取り出し、これはボックス化されているので、それを、取り除くコマンドが続きます。これでファイル名が取り出されます。
a_file =. >0{y NB. get first boxed item from y and open box as filename
次に、オフセット、これは、yの2番目の要素を取り出し、さらに、ボックスをはずします。
offset =. >1{y NB. get second boxed item from y and open as offset
ボックスは文字列と数値を混在させた配列を作るJ言語の工夫なのでしょう。
filenumber =. 1!:21 <a_file NB. open the
file
これでファイルをオープンします。
x 1!:12 filenumber;offset NB. indexed write
boxed vector of filenumber and offset
これで、書き込む文字列 x をfilenumber で開かれているファイルにオフセット位置、offset に書き込みます。今度は 間に ;
セミコロンがあります。この関数は ボックス化して連結するという関数です。ボックス化はこの書き込み関数が要求している仕様です。
1!:22 filenumber NB. close the file
これで、ファイルを閉じます。
以上です。
===========
では、実験してみましょう。
上記の定義をスクリプトウインドウにペーストして、RUN->WINDOWで実行ウインドウにロードします。
a
hello world
aにhello world が代入されています。
a wtf 'test3.txt'
これをtest3.txt に書き込みます。
dir 'test3.txt'
test3.txt 2006 11 25 20 33 53 11 rw- -----a
p=. 2 3
p
2 3
pに 2 3 というベクトルを代入します。最初がオフセットの2、次の要素は読み込むバイト数で3です。これは任意です。
'test3.txt' indexed_read p
llo
hello world
~~~
3文字目(オフセットは2)から3文字が読み出されています。
次に、test3.txtのオフセット2の位置に '123'を書き込みます。
'123' indexed_write 'test3.txt';2
1
戻りの1は成功したという意味です。true 真 が返されるようです。
rff 'test3.txt'
he123 world
~~~
読み出してみると、意図した位置に文字列が書き込まれているのが確認できます。
以上です。
これで、外の世界と自由にデータの交換が可能になりました。
J言語では読み書きは文字列で行われます。
復習です。
===
J言語は実行ウインドウで動作するインタプリタ言語である。
スクリプトウインドウで関数を定義することが出来る。
ビルトイン関数は1文字あるいは2文字を用いて記号として表す。
関数は引数を1つ、あるいは2つ必要とする。関数の定義は 引数の数で 定義式が異なる。一つの時は =:3 :0 2つの時は =:4 :0 で定義する。一つの時は関数の右に置き、2つ目は左に置く。関数内部では、右引数はyとして左引数はxとして参照される。
処理は右から行われる。左の処理を優先するには( )でくくる必要がある。ボックス化ベクトルyの第一要素を取り出し、ボックスをはずすという仕事が
<0{y
と表記されるのです。
===
ここまでの解説で出てきた関数は、
形を調べる $
変数に値を代入する =.
ベクトルの要素を取り出す {
ボックス化する <
ボックスをはずす >
ベクトル化する ,
ボックス化してベクトル化する ;
ファイル関係の関数
1!:0 y でディレクトリチェック yはボックス化ファイル名
1!:1 y で全部読み込み yはボックス化ファイル名
x 1!:2 y でxをyに書き込み yはボックス化ファイル名
x 1!:3 y でxをyに追加書き込み これは、前のセクションでは抜けてました
yはボックス化ファイル名
1!:4 y でyのサイズチェック yはボックス化ファイル名
1!:5 y でディレクトリ作成 yはボックス化した名前
1!:55 y でファイル削除 yはボックス化ファイル名
以下はインデックスによる読み書き ランダムアクセスです。
1!:21 y でファイルオープン yはボックス化ファイル名
1!:11 y オフセットと、読み込み文字数を指定して読み込み
y は ファイル番号、オフセット、文字数のベクトル
ファイル番号は 1!:21 y で返されるシステム依存の番号です
x 1!:12 y オフセットとを指定しての書き込み
y は ファイル番号とオフセットのボックス化ベクトル
1!:22 y でファイルクローズ
yはファイル番号で 1!:21 y で返されるシステム依存の番号です
以上です。