1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

explicit definition ― J 言語入門

Last updated at Posted at 2021-06-30

tacit definition

フックやフォークなどの、noun 以外の値を作る字句の並びを train と呼び、train を使った定義を tacit definition (暗黙の定義) と言います。

average=: +/ % #

tacit definition は、シンプルな計算を定義するのに向いていますが、複雑なアルゴリズムなどを記述するのは困難です。

explicit definition

explicit definition (明示的な定義) は、具体的な処理を記述して verb などを定義する機能です。

上の average の例を explicit definition で表現すると、以下のようになります 1

average=: monad define
   sum=. +/y
   count=. #y
   sum % count
)

まず 1 行目を見てみましょう。monad define とありますが、これが explicit definition を開始します。文字通り monad を定義しています。

5 行目の ) までが、explicit definition の本体になります (この ) に対応する ( はありません)。

explicit definition の内部では、ローカル変数を使うことができます。引数 y もローカル変数です。ローカル変数へ代入するときは、=. を使います。

複数の文 (sentence) を続けて実行するには、改行で区切って並べます。*1 行に複数の文を書いたり、1 つの文を複数行にわたって書くことはできません。*最後に実行した文の結果が、verb の返す値になります。

種類

verb に加えて modifier の定義もできます。

定義方法 内容
monad define monad
dyad define dyad
verb define monad と dyad 両方の使い方ができる (dual-valence) verb
adverb define adverb
conjunction define conjunction

verb

monad define の場合は引数 ydyad define の場合は引数 xy が定義されています。

   negate=: monad define
      -y
   )
   negate 1
_1
   subtract=: dyad define
      x - y
   )
   3 subtract 1
2

verb define の定義部分は、monad バージョンと dyad バージョンを : で区切って書きます。順番は monaddyad の順です。

   minus=: verb define
      NB. monad
      -y
   :
      NB. dyad
      x - y
   )
   minus 1
_1
   3 minus 1
2

modifier

adverb define では、um が被演算子を表します。verb の被演算子を受け付ける場合は u を、noun の被演算子を受け付ける場合は m を使います。

modifier は、noun, verb, adverb, conjunction のいずれの値も返すことができます。

   NB. u を 2 回適用する verb を返す
   twice=: adverb define
      u@u
   )
   0&,twice 1
0 0 1
   NB. 文字列 m のバイト値 (noun) を返す
   bytes=: adverb define
      a. i. m
   )
   'Text'bytes
84 101 120 116

被演算子の種類が一致しない場合 (間違った使い方をした場合) はエラーになります。

   3 twice
|domain error
|   u    @u
   +bytes
|value error
|   a.i.    m

verb を返す modifier の場合、xy を使って verb の定義をそのまま書くこともできます。verb define と同様に : が monad・dyad を区切る役割をします。この方法で定義するときは、noun を返す必要があります。

   NB. 引数と u の結果を返す
   show=: adverb define
      y ; u y
   :
      x ; y ; x u y
   )
   -show 1
┌─┬──┐
1_1
└─┴──┘
   3 -show 1
┌─┬─┬─┐
312
└─┴─┴─┘

conjunction define も adverb と同じように定義できます。右の被演算子は v (verb の場合) または n (noun の場合) です。

注意点

explicit definition には、いくつか注意するべき点があります。

まず、explicit definition を入れ子にすることはできません。これには多分歴史的な事情もあると思うのですが、代替の構文 2 があるので困ることはありません。

もう一点、区切りや終端を表す :) の行にはスペース (インデント) は入れてもいいですが、他の文字を含んではいけません。コメントもダメです 3


[ 前 : フックとフォーク ] [ 目次 ] [ 次 : 複数行のリテラル ]

  1. 説明のため あえて冗長な書き方をしています。

  2. この記事には書ききれないので、改めて紹介しようと思います。

  3. その位置にコメントを書くことはないと思いますが、念のため。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?