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章 外部接続詞

<APPENDIX>

 

 

 

第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 で返されるシステム依存の番号です

以上です。