Lisp M式への回帰(スクリプト言語GavaOne概説書<体験版>)


GavaOne言語とは、「Lisp言語の良いところ」に「M式様リスト」を取り入れ、 それらを「手続き型言語から拝借した糖衣表現(syntax suger)」で包み込んでできたスクリプト言語です。
「M式様リスト」とは、Lisp S式の代りに中間コードまたはデータ構造に採用した、 M式に似た(M式様の)コンピュータ内部データ構造を言います。
本概説書は、GavaOne言語の概要を理解していただくためのものです(内容は、予告なしに変更することがあります)。

(目次)

===> Top Page

1. はじめに

GavaOne言語は、ビジネス・シミュレーション用スクリプト言語として、筆者が開発している言語で、 その特徴(目指しているもの)は、次のとおりです。

2.GavaOne言語における会話型処理の進み方

GavaOne言語は、処理システムを起動後、入力された「処理関数」または「フレーム文」を中間コードに翻訳したのち、 その中間コードに従って(解釈して)、データ処理(実行または評価と言う)をすすめていく言語です。
中間コードと処理対象データのコンピュータ内部データ構造は、共に二進木形式(リスト)である 「M式様リスト」で表わされ、逆翻訳によって、元のフレーム文に戻して見ることができます。
「M式様リスト」については、別ページ「Lisp M式への回帰(スクリプト言語GavaOne)」 の解説をご覧ください。
また、本ホーム・ページでは、GavaOne言語の基本動作と各処理関数の処理機能を中心に解説します。 各関数を組み合わせた手続き的処理は、 別ページ「Lisp M式への回帰(スクリプト言語GavaOne事例集<体験版>)」 に、 処理事例として記載していますので、合せてご参照くだされば、GavaOne言語の概要がよりご理解願えるものと思います。
次に、GavaOne言語における会話型処理の一例を掲げます。(文字">"は、入力要求表示です)


    > add[1,2];                  1と2を加えるよう関数add[]を入力します。(電卓的使用例)
     3                            結果3を表示します。
    > x:=5;                       フレーム文'xを定義します。(xは、大域変数)
     'x                           フレーム名'xを返します。
    > y:=2;                       フレーム文'yを定義します。(yは、大域変数)
     'y                           フレーム名'yを返します。
    > sub[x,y];                   大域変数xの値5から、大域変数yの値2を減算(subtract)します。
     3                            結果3を表示します。
    > tasu[?x!,?y!]:=add[x!,y!];  二つの数値を加算するフレーム文を入力し、登録します。(x!,y!は、局所変数) 
     'tasu                        フレーム・テーブルに、フレーム'tasuが登録されました。
    > tasu[3,4];                  ユーザー定義関数tasu[]に、実引数3と4を入れて、評価を指示します。
     7                            結果7を表示します。
    > hiku[?x!,?y!]:=sub[x!,y!];  二つの数値を減算するフレーム文を入力し、登録します。(x!,y!は、局所変数)
     'hiku                        フレーム・テーブルに、フレーム'hikuが登録されました。
    > hiku[10,2];                 ユーザー定義関数hiku[]に、実引数10と2を入れて、評価を指示します。
     8                            結果8を表示します。
    > fact[?x!]:=if[x!<=0,1,mult[x!,fact[sub[x!,1]]]]; 階乗計算のフレーム文を入力し、登録します。(x!は、局所変数)
     'fact                        フレーム名'factを返します。
    > fact[10];                   10の階乗を計算するように、指示します。
     3628800                      結果3628800を表示します。
    > dir[];                      フレーム名のリストを得るように指示します。
     ('x,'y,'tasu,'hiku,'fact)    結果を表示します。
    > ppf[];                      フレーム・テーブルに登録されているフレーム文を表示するように、指示します。
     x:=5;
     y:=2;
     tasu[?x!,?y!]:=add[x!,y!];
     hiku[?x!,?y!]:=sub[x!,y!];
     fact[?x!]:=if[x!<=0,1,mult[x!,fact[sub[x!,1]]]];
     0                            フレーム・テーブル登録のフレーム文を表示しました。
    > `end;                       `end(back_quote + "end" )を入力して、処理を終了します。

3.GavaOneシステムの基本動作

 GavaOneシステムは、次の処理サイクルで運用します。

 システムの起動 ---> 入力プロンプト(>)を表示 ---> 処理関数入力(*1){関数入力と同時に、中間コード翻訳}

↑ |
| ↓
評価結果の表示(*4) <--- 処理関数の評価(*2){`end;を評価すれば、システム終了}
↑ ↓
フレーム・テーブル(*3){フレーム文を収容するGavaOneデータベース}
(*1) 処理関数を入力すると同時に、中間コード(リスト)に翻訳します。===>「基本データ型」「リスト構造」参照 (*2) リスト表現された中間コードを、評価(実行)して、一連のデータ処理を行います。 データ処理は、フレーム・テーブル(GavaOneデータベース)との間で、参照・更新を 繰返しながら行います。 処理関数 ===>「関数の型と基本関数例」「フレーム定義関数の評価」参照 処理中フレーム文の現在値参照、またはワーキング用メモリー ===>「特殊変数」参照 フレーム・テーブルの参照・更新インターフェース ===>「フレーム・テーブルの参照・更新」参照 確信度評価関数の評価と起動タイミングの制御 ===>「確信度評価関数の評価と起動制御」参照 (*3) フレーム・テーブルは、GavaOneシステムにおける一連のデータ処理を定義し、データ処理の中間結果を 保持するテーブルです。 データ処理定義文 ===> 「フレーム(frame)文」参照 フレーム・テーブルの内部構造 ===> 「フレーム・テーブル(frame-table)」参照 (*4) 処理関数の評価結果は、入力プロンプト(>)行の次の行に、リスト形式で自動的に表示します。

4. フレーム(frame)文

「フレーム文」とは、GavaOne言語のデータ処理定義の基本単位を言い、次のとおりとします。


    インスタンス変数:=フレーム定義関数[引数1,引数2,..]|確信度評価関数[引数a,引数b,..];
 フレーム文は、そのフレーム定義関数が意味する内容により、次の二つの型に分かれます。
 (1)静的評価フレーム文
    次の宣言的文言で表わされるものです。

     「・・・・」は、「。。。。」である。

   (例)リンゴの色 := '赤い | 0.5;   <=== 「リンゴの色」のフレーム定義例
     「リンゴの色」を問われたら、一般的には「赤い」と言う。しかし、半数が違う色としたら、
     このフレーム文のインスタンス変数値の確信度は、0.5である。

 (2)動的評価フレーム文
    次の手続き的文言で表わされるものです。

     「・・・・する」とは、「。。。。すること」である。

   (例)数える.リンゴの色 := size[('赤, '緑, '黄緑, '白)]; <=== 引数(リスト)の要素数がリンゴの色数

 なお、動的評価フレーム文の特殊型として、「ユーザー定義関数」があります。

5. フレーム・テーブル(frame-table)

「フレーム・テーブル」とは、フレーム文を入力順に登録するテーブルであると同時に、 そのフレーム文で定義されたデータ処理関数の実行(評価)結果を収容するテーブルです。
フレーム・テーブルに収容される項目と属性値は、次のとおりです。


  フレーム番号               <=== フレーム文の登録番号(整数値)
  インスタンス変数名(フレーム名を兼ねる) <=== 大域変数、またはユーザー定義関数の名前(文字列リテラル)(*1)
  ユーザー定義関数仮引数リスト(*2)     <=== リンクアドレス
  フレーム定義関数リスト          <=== リンクアドレス
  インスタンス変数値リスト(*3)       <=== リンクアドレス
  確信度評価関数リスト           <=== リンクアドレス
  確信度(*4)                <=== 実数値
  その他(省略)
      (*1)インスタンス変数名の先頭に「'(single quote)」をつけて、フレーム名とします。
      (*2)インスタンス変数に仮引数リストをつけて、ユーザー定義関数としたときの仮引数リストが入ります。
      (*3)「フレーム定義関数リスト」の評価結果、または「ユーザー定義関数」呼出し時の実引数が入ります。
      (*4)確信度評価関数リストの評価結果が入ります。確信度評価関数リストがない場合は、デフォルト値1.0が入ります。

6.フレーム・テーブルの参照・更新

 処理関数から、フレーム・テーブルに収容されたフレーム文、または、インスタンス変数値を 参照・更新するには、次のとおりとします。

7.インスタンス変数

「インスタンス変数」とは、データ処理(実行または評価)の結果を収容するフレーム・テーブル上の場所に 付けた名前(インスタンス変数名)で、インスタンス変数にアクセスすることによって、フレーム・テーブル上の値を 参照または更新します。
インスタンス変数は、その参照・更新できる領域に応じて、「大域変数」と「局所変数」の二つに分かれます。
変数名は、英数字、特殊文字の一部、または漢字の文字列(但し、先頭の数字は不可)とします。
「特殊文字の一部」とは、文字"-"(ハイフン)、"."(ドット)、"!"(局所変数のみ使用可)を言います。


大域変数と局所変数は、それが用いられる働きに応じて、色々な名前(インスタンス変数、マスク変数など) で呼ばれます。(説明は、登場の都度、説明します)
大域変数、局所変数には、どのようなデータ型も代入することができます。

8.特殊変数

評価・演算支援のための値を格納するコンピュータ・メモリー上の特定の場所(ワーキング・メモリー)を言います。
特殊変数には、「システム変数」と「レジスター変数」があります。

9.基本データ型

基本データ型には、次のデータ型があります。

10.リスト構造

リスト(M式様リスト)とは、基本データ型で表わされる複数の値(以下「要素」という)を 括弧( )で挟み、各要素の間を、,(カンマ)または空白で仕切ったものを言います。
リストは、また、リストの要素となることができます。


 (例)(1,2,3,4,5)          <--- フラットなリストで、「ベクトル」とも言います。
       (1,2,(3,4),5)        <--- リストは、また、リストの要素となることができます。
       (A,B,C,4,5)          <--- すべてのデータ型を、リストの要素とすることができます。
       ("AB C","C  DE","F") <--- 文字列の一部に、空白を含む場合は、"(二重引用符)で囲みます。
       '(add[1,2],sub[4,5]) <--- 関数もリストの要素となることができます。
       四季:=('春, '夏, '秋, '冬); <--- フレーム文も、リスト形式に翻訳(変換)されます。

11.関数の型と基本関数例

  関数の型には、一般型、前置型、中置型の三つがあります。
  システムであらかじめ用意している関数を「システム関数」と言い、その使用代表例を掲げます。
 (1)一般型
      > list[1,2,3,4,5];     関数list[]の各引数から、リスト(1,2,3,4,5)をつくる。
       (1,2,3,4,5)           list[1,2,3,4,5];は、(1,2,3,4,5);と略記できる。

      > head[(1,2,3,4,5)];  リスト(1,2,3,4,5)の先頭項を取り出す(>は、入力要求のプロンプト)。
       1           結果1を返す(関数を入力した次の行に結果を返す)。

      > tail[(1,2,3,4,5)];  リスト(1,2,3,4,5)の先頭項を除いたリストを取り出す。
       (2,3,4,5)       結果リスト(2,3,4,5)を返す。

      > append[1,(2,3,4,5)]; リスト(2,3,4,5)の先頭に、1を挿入する。
       (1,2,3,4,5)           結果リスト(1,2,3,4,5)を返す。

      > connect[(1,2),(3,4)];リスト(1,2)の後尾に、リスト(3,4)を連結する。
       (1,2,3,4)             結果リスト(1,2,3,4)を返す。

      > adjust[(1,(2,3),4)]: 引数リストを整理して、フラットなリストにする。(ベクトル化)
       (1,2,3,4)

      > nth[2,(1,(2,3),4)]:  第2引数リスト(1,(2,3),4)の第1引数番目の要素を抽出する。
       (2,3)                 結果リスト(2,3)を返す。

      > remov[2,(2,3,4,5)];  リスト(2,3,4,5)の2番目の要素3を削除し、リスト(2,4,5)を返す。
       (2,4,5)

      > size[('a,'b,'c)];    引数(リスト)の項の数を調べ、その結果を返す。
       3

      > eq[x,y];             変数xの値が、変数yに等しいならば、1(真)を返す。
       1                     そうでないならば、0(偽)を返す。
                             この関数の中置型表記は、x=yと表す。

      > isnil[nil];          引数の値が、nil(空値)ならば、1(真)を返す。
       1                     そうでないならば、0(偽)を返す。

      > islist[(1,2,3)];     引数の値が、リストならば、1(真)を返す。
       1                     そうでないならば、0(偽)を返す。

      > isdigit[5];          引数の値が、数値(整数または実数)ならば、1(真)を返す。
       1                     そうでないならば、0(偽)を返す。

      > not[x];              変数xの値(論理値)が、1(真)ならば、0(偽)に、
       0                     0(偽)ならば、1(真)を返す。(前置型表記は、~(x))

      > if[x=0,1,2];         変数xの値が0ならば、1を返す。それ以外は、2を返す。
       1                     

      > add[1,2];            1と2を加算し、結果3を返す。第1引数、第2引数が共にリストの場合は、
       3                      各引数の対応する要素を加算します。add[(1,2),(3,4)]; ===> (4,6)

      > sub[3,1];            3から1を差し引いて、結果2を返す。第1引数、第2引数が共にリストの場合は、
       2                     各引数の対応する要素を減算します。sub[(5,2),(3,1)]; ===> (2,1)

      > mult[2,3];           2と3を掛け算して、結果6を返す。第1引数、第2引数が共にリストの場合は、
       6                     各引数の対応する要素を掛け算します。mult[(5,2),(3,1)]; ===> (15,2)

      > div[3,2];            3を2で割って、結果1.5を返す。第1引数、第2引数が共にリストの場合は、
       1.5                   各引数の対応する要素を割り算します。div[(5,8),(2,4)]; ===> (2.5,2.0)

      > pow[3,2];            3を2乗して、結果9を返す。(power)
       9

      > sum[1,2,3];           引数のすべての要素(数値)を合計して、その結果を返す。
       6

      > incr[x,a];            変数xの値を a増加し、その結果を返す。aを省略したとき、a=1とみなす。(increase)

      > decr[x,a];            変数xの値を a減少し、その結果を返す。aを省略したとき、a=1とみなす。(decrease)

      > succ[a];              aが、整数または実数のとき、aに1を加えた値を返す。(successor)

      > pred[a];              aが、整数または実数のとき、aから1を差し引いた値を返す。(predecessor)

      > set[x!,(1,2,3)];      変数x!に、リスト(1,2,3)を与え、リスト(1,2,3)を返す。
                              set[(x!,y!),list[1,2,3]];ならば、変数x!に1を、変数y!に2を与え、リスト(1,2,3)を返す。
                              set[(x!),list[1,2,3]];ならば、変数x!に1を与え、リスト(1,2,3)を返す。
                              第1引数は、レジスター変数とすることもできる。

  (2)前置型
      > *hensuu;             フレーム文'hensuuのフレーム定義関数(body)を評価して、
                             インスタンス変数hensuuに与え、同じ値を返す。
                            (結果表示は省略、以下同じ)

      > &hensuu;             フレーム文'hensuuのフレーム定義関数(body)を評価して、
                             その結果を返す(元のインスタンス変数hensuuの値は変わらない)

      > @1;                  整数レジスター1の値を参照する。(n番目は、@(n)で示す)

      > %1;                  演算レジスター1の値を参照する。(n番目は、%(n)で示す)

      > #1;                  汎用レジスター1の値を参照する。(n番目は、#(n)で示す)

      ? ~(2<1);              関数~(チルダ)と言い、論理値を逆転(真==>偽、偽==>)し、その結果1を返す。

      > 'hensuu;             インスタンス変数名の前に、'(single quote)をつけて、
                             インスタンス変数hensuuで始まるフレーム定義文の「フレーム名」とする。
                             仮フレーム名を付けることができる ===> 文字列リテラルの代りに使用可

      > '(x, y, z);          リストの前に、'(single quote)をつけて、
                             以下につづくリストの各項の評価(この場合は、変数値の参照)を
                             禁止する。結果として、'(x, y, z)を返す。

  (3)中置型
      > x:=add[1,2];         フレーム文xを定義登録する。関数def[x,add[1,2]]の中置型表記である。

      > x:y;                 変数xに変数yの値を代入する。関数set[x,y]の中置型表記である。
                             これによって、フレーム文xのインスタンス変数値が、変数yの値に変わる。
                             '(x!,y!):list[1,2,3];ならば、変数x!,y!に、それぞれ1と2を与え、リスト(1,2,3)を返す。
                             '(x!):list[1,2,3];ならば、変数x!に、1を与え、リスト(1,2,3)を返す。
                             @0:10;として、#(@0):list['a,'b];ならば、#10にリスト('a,'b)を与え、リスト('a,'b)を返す。
                             '(#1,#2):list['a,'b];ならば、#1に'a、#2に'bを与え、リスト('a,'b)を返す。

      > x=y;                 変数xと変数yの値が等しいならば、1を返す。
                             そうでないとき、0を返す。eq[x,y]の中置型表記である。
                             その他、比較演算子として、<,>,<=,>=,<>(not equal)がある。

      > x==y;                変数xと変数yが共にリストであるとき、xとyをパターン・マッチング
                             する。(マッチのとき、1を、アンマッチのとき、0を返す)。
                             equal[x,y]の中置型表記である。

      > 'add/(1,2);          中置演算子/は、関数apply[]の中置型表記で、apply['add,(1,2)]に同じ。
                             右辺を実引数にして、左辺の文字列で表わされる関数add[]を評価する。
                             結果3を返す。(高階関数apply[]の中置型表記例)

12.逐次評価関数と繰返し評価関数

  逐次評価関数と繰返し評価関数の使用代表例を、次に掲げます。
 (1)逐次評価関数
      > do[add[2,3],sub[`dv,1]]; 関数do[]の引数を、左から順に評価し、最後尾の項の評価結果4
                                  を返す。(`dvは、前出「システム変数」を参照)
                                  なお、左から評価している途中の結果を、関数do[]の評価結果にする場合は、
                                  関数break[]の引数に途中の結果を入れて、関数do[]の評価を中断する。

 (2)繰返し評価関数
      > while[decr[x]>0,print[x,"ln"]]; 関数while[]の左から一番目の引数を評価して、その結果が
                                  「真」ならば、左から二番目の引数の評価を繰り返す。
                                   この場合、decr[x]の評価結果が正数ならば、変数xの値の
                                   プリントを繰り返す。(decr[x]は、変数xの値から1を差し引く)
                                   途中で得られた値を関数while[]の最終結果にする場合は、上記(1)に準じ、
                                   関数break[]を含む処理列を、関数while[]の第2引数に記述する。

13.高階関数

  GaveOne言語における「高階関数」とは、関数の第1引数に適用すべき関数名(文字列リテラル)を 置き、
 第2引数に、適用すべき関数の引数を列挙して、適用すべき関数を評価するもので、その使用代表例を掲げます。
 (1)単一引数適用型
      > apply['add,(1,2)];   関数add[1,2]と同じ評価結果を返します。これを中置型表記すれば、
                             'add/(1,2)となる。(中置型表記を推奨します)

 (2)複数引数適用型
      > map['add,((1,2),(3,4))]; 関数map[]の第2引数(リスト)の各項(サブ・リスト)に対し、
                             関数map[]の第1引数で指定した関数を適用して、その評価結果を返す。
                             この使用例では、(add[1,2],add[3,4])を計算して、結果リスト(3,7)を返す。
                             これを中置型表記すれば、
                             'add//((1,2),(3,4))となる。(中置型表記を推奨します)

  (3)引数組合せ適用型
      > cross['add,((1,2),(3,4))]; 関数cross[]の第2引数(リスト)の各項(サブ・リスト)の
                             サブ・リスト要素の組み合わせに対し、関数add[]を適用して、
                             その評価結果を返す。
                             この使用例では、((add[1,3],add[2,3]),(add[2,3],add[2,4]))を計算して、
                             結果リスト((4,5),(5,6))を返す。
                             これを中置型表記すれば、
                             'add/^((1,2),(3,4))となる。(中置型表記を推奨します)

 (4)引数折りたたみ適用型
      > reduce['add,(1,2,3,4)]; 関数reduce[]の第2引数(リスト)の各項に対し、次のとおり
                             関数reduce[]の第1引数で指定した関数(2引数関数)を適用する。
                             add[1,add[2,add[3,4]]]; ===> 結果として、1+2+3+4の合計値10を返す。
                             (参考)reduce['mult,(1,2,3,4)];は、4の階乗24を返す。

  なお、中置型表現した高階関数(apply[],map[],cross[])の場合は、更に、右辺に「中置型表記した高階関数」
  を記述できます。===> 高階関数中置型における右辺優先評価
   (例)apply['add,map['add,((1,2),(3,4),(5,6))]]; を中置型で表現すれば、
            'add/'add//((1,2),(3,4),(5,6)); であり、結果21を返す。===> []括弧の省略

14.比較演算子と条件分岐

  比較演算の結果である「真理値」と条件分岐との関係は、次のとおりです。

  「真理値」は、特定の文字列表現(true、false等)せず、正数をもって「真」、   その他を「偽」とし、条件分岐時の引数の真偽判定は、次による。     判定対象数値 > 0ならば、「真」の処理     その他は、「偽」の処理を評価(実行)する。   但し、パターン・マッチングにおけるマッチ、アンマッチの判定は、マスク変数の確信度を   基準に決定するものとし、     マッチング項目であるマスク変数の確信度が、正ならば「真」、ゼロまたは負ならば「偽」   となります。===> 15.パターン・マッチングとマスク変数を参照ください。       以下に、比較演算子(比較関数)と条件分岐関数の使用代表例を掲げます。  (1)比較演算子(比較関数)     > 1<2; ===> 1(真)を返す。比較関数では、lt[1,2]と表す(less than)     > 1>2; ===> 0(偽)を返す。--> gt[1,2](greater than)     > 2=2; ===> 1(真)を返す。--> eq[2,2](equal)     > 2<=3; ===> 1(真)を返す。--> le[2,3](less or equal)     > 2>=3; ===> 0(偽)を返す。--> ge[2,3](greater or equal) > 2<>3; ===> 1(真)を返す。--> ne[2,3](not equal)  (2)条件分岐   @)関数if[]による条件分岐 > if[x>y,sub[x,y],sub[y,x]]; ===> 変数x,yの差を計算し、その結果を返す。        関数if[]の第1引数は、真理値とし、真理値が「真」のとき、第2引数の評価結果を、        真理値が「偽」のときは、第3引数の評価結果を返す。       (注)第3引数は省略可、真理値が「偽」のとき、nil(空値)を返す。 A)関数cond[]による条件分岐 > cond[(x>y,sub[x,y]),(x<y,sub[y,x]),(1,0)]; ===> @)と同様に、変数x,yの差を計算し、 結果を返す。        関数cond[]の各引数リストの第1要素(比較関数)を、左から順に評価して、 それが「真」であれば、同じ引数リストの第2要素を評価した結果を、 関数cond[]の結果とする。 B)関数case[]による条件分岐 > case[p,a1,a2,...ak,..an]; ===> パラメータ p を評価して、p の結果が k ならば、 ak を評価して、その結果を関数の値とする。 p の結果が n より大きいならば、最後の項anを評価し、その結果を関数の値とする。 (例)case[p,add[1,2],add[3,4],add[5,6]]; とすると p=2 ならば add[3,4]; を評価し、結果 7を関数の値とする。 p=4 ならば p>3 であるから,add[5,6];を評価し、11となる。

15.パターン・マッチングとマスク変数

  パターン・マッチングのための関数は、equal[],assoc[],match[]などがあります。

 インスタンス変数の前に前置型関数表示?または??をつけたものを、「マスク変数」と言います。
 次のマスク変数の性質に留意しながら、以下の事例を参照してください。
 (1)リストとリストのパターン・マッチング(関数equal[]) > equal[x,y]; 第1引数xと第2引数yを比較して、「マッチ」ならば、結果として、先頭の要素を1として、 マッチした最終要素までの要素数を返す。 なお、マッチング時の要素の比較では、英字の大文字と小文字を区別しない。 先頭の要素でアンマッチのときは0を返す。そうでないときは、先頭の要素以降で、 アンマッチになる直前までのマッチ要素数に、-1を乗じた数を返す。 equal[x,y]; は、x==y; と中置型表記できる。(中置型表記を推奨します) 次に、第1引数xと第2引数yのリスト内容によって、どのようになるかを 例示する。      equal[(1,2,3),(1,2,3)]; ===> 3(マッチ)を返す。 equal[(1,2,3),(2,2,3)]; ===> 0(アンマッチ)      equal[(1,?z,3),(1,2,3)]; ===> 3(マッチ)、要素?zは、「マスク変数」と言い、 「対応する要素とマッチする変数」です。 マッチングした後、変数zに、2が代入される。      equal[(1,??z),(1,2,3)]; ===> 2(マッチ)、 要素??zも、「マスク変数」と言い、 「対応する要素以降、末尾までの要素とマッチする変数」です。 マッチングした後、変数zに、(2,3)が代入される。      equal[(??z),(1,2,3)]; ===> 1(マッチ)、 要素??zは、リスト(1,2,3)に対応し、 マッチングした後、変数zに、(1,2,3)が代入される。 > equal[?x,?y]; 第1引数xと第2引数yが、共にマスク変数であるとき、 変数xと変数yのインスタンス変数値を入れ換え(swap)、結果として、1を返す。 equal[?x,?y]; は、?x==?y; と中置型表記できる。(中置型表記を推奨します)  (2)リスト(パターン・リスト)と複数要素とのパターン・マッチング(関数assoc[]) > assoc[p,(a1,a2,...an)];パターン・リストp と リスト(a1,a2,..an)の各項をパターン・マッチングして、 リスト(a1,a2,..an)のマッチした要素の左からの番号を返します。(associate) なお、マッチしない場合は、 0を返します。 (例)assoc['(b,?x),'((a,10),(b,20),(c,30))];ならば、変数xに20を与え、結果2を返す。  (3)リスト(パターン・リスト)と複数リストとのパターン・マッチング(関数match[])    > A:=('aa,10);    > B:=('bb,20);    > C:=('cc,30);     > X:=0;       と定義して、  > match[('bb,?X),(A,B,C)];ならば、インスタンス値20をX に与え、リスト('bb,20)を返す。   (注1)match関数の第1引数は、パターン・リストである。 〃   の第1引数の「?X」は、マスク変数Xと言う。         〃   の第2引数は、マッチング対象リストで、引数評価後は、             リスト(('aa,10),('bb,20),('cc,30))である。 なお、システム変数`mch(バッククオート mch)を参照すれば、リスト(A,B,C)のうち 何番目の要素とマッチしたかを表すリスト(上記の場合は、(0,2,0))を得ることができる。    (注2)パターン・マッチングしない場合は、結果として,nil(空値)を返す。

16.フレーム定義関数の評価

会話型言語であるGavaOneは、関数を直接入力することで、関数の意図する処理を評価(実行)します。 更に、フレーム文をフレーム・テーブルに定義登録し、そのインスタンス変数名につながるフレーム定義関数を 評価(実行)することによって、連続、かつ、ひとかたまりの処理を行うことができます。
フレーム・テーブル上にあるフレーム定義関数を評価するには、次の3つの方法があります。

17.確信度評価関数の評価と起動制御

インスタンス変数値に確信度を与える確信度評価関数の評価開始(起動)のタイミングは、次によって、制御されています。


 次の関数cfsw[]により、確信度評価関数の起動タイミングを制御できます。
        > cfsw['f,s];  ===> 'fは、確信度評価関数の属するフレーム名、
                               sは、整数とし、設定するsの値により、起動タイミングを、
                               次のとおり、切り替えることができる。
             s>0 --> インスタンス変数値の置き換え直後に起動する
       s=0 --> 自動起動しない(別途評価するときは、次の関数evalcf[]で評価し、確信度を設定する) 
             s<0 --> インスタンス変数の値が変更された場合に起動する(変更されなければ、起動しない)

             > evalcf['f];  ===>  文字リテラル'f で表されるフレーム文の確信度評価関数を起動し、
                                     そのフレーム文の確信度を更新する。

18.その他のシステム関数

いままで掲げたシステム関数のほかに、その他の代表的なシステム関数を列挙します。
 (1)リストの生成
      > iota[n,a];    初項をaとし、n個の自然数のリストを生成する。
                      初項aを省略した場合は、初項を1とみなす。
                         (例)iota[5]; を評価すると、(1,2,3,4,5)を生成する。
                               iota[5,0]; を評価すると、(0,1,2,3,4)を生成する。

      > gen[a,k,r,s];   リストを生成する。(generate)
                      引数rを指定しない場合は、a(リテラル、またはリスト)を k回ほど繰り返したリストを生成する。
                      引数rを指定した場合は、引数a,k,rはいずれも数値とし、初項をaとし、
                      階差をrとする数値項をk個持つ、数値リストを生成する。
                      引数sには、引数a,k,rを指定して生成されたリテラル、またはリストに対し、最終的に結果として
                      出力するかを判定するルーチン(評価結果が正数ならば、その要素を結果リストに含める)を、入力する。
                         (例)gen[(3,4,5),2]; を評価すると、((3,4,5),(3,4,5))を生成する。
                               gen[0,3,2]; を評価すると、(0,2,4)を生成する。
                               gen[1,10,2,if[mod[`gv,3]=0,0,1]]; を評価すると、生成されたリスト要素のうち、
                                          3の倍数を除いた要素からなるリスト(1,5,7,11,13,17,19)を生成する。
                                          なお、`gvは、第1引数〜第3引数から生成されたリスト要素を
                                          参照するシステム変数で、if[mod[`gv,3]=0,0,1]は、「3の倍数を除いた要素」を
                                          判定するルーチンである。

      > cp[x];        リストの複製をつくる。(copy_list)
                      引数xの複製をつくり、その結果を返す。

      > dir['a!];     フレーム名の先頭が、aであるものを探し、そのフレーム名のリストをつくる。(directory)
                      また、引数がないとき(dir[])は、すべてのフレーム名のリストをつくる。
                      (注)引数'a!中の文字"!"は、「以下をカットする」意で、局所変数表示の"!"ではない。

      > class['f1,'f2];  フレーム・テーブル上のフレーム名f1からフレーム名f2までのフレーム名のリストをつくり、
                         結果として返す。

 (2)リスト要素の抽出・削除
      > frst[x];      変数(リスト)xの最初の要素を参照する。(first)
                      x:=('a,'b,'c,'d);として、frst[x];ならば、結果'aを返す。

      > scnd[x];      変数(リスト)xの二番目の要素を参照する。(second)
                      x:=('a,'b,'c,'d);として、scnd[x];ならば、結果'bを返す。

      > thrd[x];      変数(リスト)xの三番目の要素を参照する。(third)
                      x:=('a,'b,'c,'d);として、thrd[x];ならば、結果'cを返す。

      > last[x];      変数(リスト)xの最後尾の要素を参照する。
                      x:=('a,'b,'c,'d);として、last[x];ならば、結果'dを返す。

      > refer[n,x];   変数(リスト)xのn番目までの要素を参照する。(但し、n>0)
                      x:=('a,'b,'c,'d);として、refer[2,x];ならば、結果('a,'b)を返す。

      > refer[m,x];   変数(リスト)xのm番目までの要素を除いた残りの要素を参照する。(但し、m<0)
                      x:=('a,'b,'c,'d);として、refer[-2,x];ならば、結果('c,'d)を返す。

      > extract[(k1,k2,..kn),(a1,a2,..an)]; リストの複数要素を抽出する。
                      0または正の整数からなるリスト(k1,k2,..kn)のp番目の要素が正の整数ならば、
                      リスト(a1,a2,..an)のp番目の要素を抽出したリストを結果として返す。 
                      (例)extract[(0,2,0,1),'(a,b,c,d)];ならば、リスト'(b,d)を返す。

      > drop[(k1,k2,..kn),(a1,a2,..an)];   リストの複数要素を削除する。
                      0または正の整数からなるリスト(k1,k2,..kn)のp番目の項が正の整数ならば、
                      リスト(a1,a2,..an)のp番目の項を削除したリストを結果として返す。 
                      (例)drop[(0,2,0,4),'(a,b,c,d)];ならば、リスト'(a,c)を返す。               

      > expur['x,(a1,a2,..an)];   リストの特定要素を削除する。(expurgate)
                      第2引数リスト(a1,a2,..an)の項aiが、'xに等しいとき、aiを削除し、その結果を返す。
                      第1引数'xは、マスク変数を含むリストとすることができる。
                    (例) expur['a,('a,'b,'a,'d)];ならば、リスト('b,'d)を返す。

      > pack[x];      リスト中の空値()の削除
                      x が、リスト(1,nil,3)ならば、リスト(1,3)を返す。

 (3)リストの配分・編集
      > distr[x,a];   変数(リスト)xの各要素と、第2引数との対リストを作る。(distribute from righthand side)
                      x:=('a,'b); a:=('c,'d);として、distr[x,a];ならば、結果(('a,('c,'d)),('b,('c,'d)))を返す。

      > distl[a,x];   変数(リスト)xの各要素と、第1引数との対リストを作る。(distribute from lefthand side)
                      a:=('a,'b); x:=('c,'d);として、distl[a,x];ならば、結果((('a,'b)'c),(('a,'b),'d))を返す。

      > pair[x,y];    変数(リスト)xの各要素と変数(リスト)yの各要素について、対応要素で対リストをつくる。
                      リストxとリストyの長さ(要素数)が異なる場合は、いずれか長いリストの末尾部分は無視する。
                      x:=('a,'b); y:=('c,'d); として、pair[x,y];ならば、結果(('a,'c),('b,'d))を返す。

      > push[a,x];    変数(リスト)xの先頭に、変数aの値を挿入する。
                      a:='a; x:=('c,'d);として、push[a,x];ならば、結果('a,'c,'d)を返す。

      > pop[x];       変数(リスト)xの先頭要素を抽出し、変数(リスト)xから先頭要素を取り除く。
                      x:=('a,'b,'c,'d);として、pop[x];ならば、xの値を('b,'c,'d)とし、結果'aを返す。

      > top[x];       変数(リスト)xの先頭要素を抽出する、xの値は、変わらない。
                      x:=('a,'b,'c,'d);として、top[x];ならば、xの値は('a,'b,'c,'d)のままで、結果'aを返す。

      > array[(a1,a2,..an),k,b];  ベクトル(a1,a2,..an)を、一行の要素数(列数)がk個のリスト(行列)に変換する。
                       bは、一行の要素数(列数)がk個に満たないとき、満たない要素を埋める値を指定する。
                       array[(1,2,3,4,5),2,0];ならば、3行2列のリスト((1,2),(3,4),(5,0))を返す。

      > revlist[(a1,a2,...an)]; または revlist[a1,a2,...an];  逆順配列(リスト)の生成(reverse_list)
                       リスト(a1,a2,...an)の各項を逆順に配列し、その結果、リスト(an,...a2,a1)を返す。
                       revlist[(1,2,3)]; ならば、リスト(3,2,1) を返す。

      > transpos[a,k]    リスト a(行列)の行と列を入れ替えたリストをつくり、その結果を返す。(transpose)
                         kは、リストaの行と列の数が合わないときに与える充足値を、指定する。
                    transpos[((1,2),(3,4),(5,6))];ならば、リスト((1,3,5),(2,4,6))を返す。

      > inverse[a,EPS];  リスト a(行列)の逆行列を求め、その結果を返す。
                         なお、ピボット値が、絶対値で EPS未満の場合に、0とみなす基準値を指定する。
                         EPSを省略した場合は、EPS=1.0E-8とみなす。

 (4)文字列の分割・連結
      > substr[a,s,e]; 第二引数sと第三引数eが、共に整数のとき、文字列a のs番目から(e-1)番目までを複写して、
                       新しい文字列をつくり、それを返す。(substring)
                         なお、eを省略したときか、または、e=0のときは、eを文字列a のs番目から末尾までを複写して、
                       新しい文字列をつくり、それを返す(eを最終文字位置+1とみなす)。

      > sep[a,k,s];    区分文字列kを境に、文字列aを分割し、リスト(ベクトル)をつくる。(separate)
                       sは、文字列 a 上での分割開始文字位置を指定する。sを省略した場合は、s=1とみなす。
                       kが、nilまたは""ならば、文字列aの開始文字位置sから末尾までの各文字を要素とするリストを返す。

      > concat[a1,a2,...an]; a1,a2,...an の各項を連結して、その結果を、返す。(concatenate)
                       項の値が文字列ならば、そのまま連結し、項の値が整数または実数ならば、
                       文字列に変換して連結する。

      > length[a];     変数aが文字列であるとき、文字列の長さ(文字数)を返す。
                       なお、ひらがな、漢字の1文字は長さ1として数える。

 (5)データ入力・出力
      > exec["xxx"];     ファイル xxx.txtを読み込み、ファイルの各行を入力順に評価する。(execute)
                         引数には、ファイルの識別名txtを除いたファイル名 xxxを指定する(識別名txtは自動的に付加)。
                         このexec[]関数により、フレーム文を事前にファイルに入力し、システムに取り込むことができる。

      > input[a];     データ入力の要求メッセージ゙aを表示して、データ入力を受け付ける。
                      結果として、入力したデータ(文字列)またはリストを返す。

      > print[a,k];   a を評価し、その結果を印刷する。k は、改行を制御するパラメータで、
                      k が"ln","n",または"r"のとき、印刷後に改行する。k を省略したときは、印刷後に改行しない。

      > tpr[x!,"msg",'f]; 変数x!、またはリストx!の内容を、リスト形式で表示する。
                      結果として、x!の評価結果を返す。(test_print)
                      msgは、表示時の見出しを入力する(省略可)。
                      'fは、変数x!の内容をフレーム'fの環境下で参照・プリントする場合、設定する。
                      なお、'fの代りに、フレーム'fのフレーム番号を入力することができます。
                      (例)tpr[x!,"x!="];ならば、変数x!の内容を、見出し"x!="を付けて、プリントする。
                            tpr[x!,"x!=",'f];ならば、フレーム'fで定義している変数x!の内容を、
                                             見出し"x!="を付けて、プリントする。

      > ppf[('a,'b,..)]  フレーム名のリスト('a,'b,..)のフレーム文を整形表示する。(pretty_print_frame)
                         また、引数がないとき(ppf[])は、すべてのフレーム文を表示する。

      > ppv[('a,'b,..)]  フレーム名のリスト('a,'b,..)のインスタンス変数値を整形表示する。(pretty_print_value)
                         また、引数がないとき(ppv[])は、すべてのインスタンス変数値を表示する。

      > fread[a,"f"]     テキスト・ファイルを読み込み、データ・レコードをインスタンス変数に代入する(file_read)
                         引数aは、データ・レコードを代入するインスタンス変数とする。
                         引数"f"は、読み込むテキスト・ファイルの名前(拡張子.txtは付けない)とする。
                         各テキスト・ファイルに整数1〜99を割り当て、fread[]の評価結果として、その整数を返す。
                         なお、読み込み対象レコードがないときは、結果として、-1を返す(読み込み終了)。

      > fprint[a,"f"]    印刷(print)イメージをファイルに出力する(file_print)
                         引数a を評価し、ファイル f に出力(行出力)する。
                         引数"f"は、テキスト・ファイル名(ファイル名には、拡張子.txtが自動的に付く)とする。
                           なお、ファイル f は、新しいファイル名とし、このfprint[]関数を初期評価することによって、
                         自動的に確保される(既存ファイルへの出力は不可)。
                           また、ファイル fの個数は、最大99個以内(99個以内の別ファイルに出力可)とする。
                         各出力ファイルに整数1〜99を割り当て、fprint[]の評価結果として、その整数を返す。

      > fclose["f"]      入出力中のテキスト・ファイル(関数fread[],fprint[]の第2引数で指定したテキスト・ファイル"f")
                         の終了処理(クローズ)を行う(但し、csv形式データのファイルについては、終了処理は不要)。
                           なお、入出力をいったん終了したテキスト・ファイルをあらためて読み込むには、入出力終了直後に、
                         関数fclose[]で終了処理を行い、ファイルを(再)読み込みできる状態にしてください。

      > import["f"]      OAツールデータ(csv形式データ)を、システムに読み込む(import)
                         csv形式データ・ファイル名(拡張子.csvを自動的に付ける)を指定して、
                         区分化コード(,)で区切られたテキストデータ(csv形式)を、システムに読み込み、
                         結果として、入力したテキストのリストを返す。

      > export["f",(g1,g2,..gn)] OAツール用データを外部ファイルに出力する(export)
                         csv形式データ・ファイル名(拡張子.csvを付けない)を指定して、リスト(g1,g2,..gn)の各項を、
                         区分化コード(,)で区切られたテキストデータ(csv形式)に変換して、
                         各項(gn)を1レコードとして、ファイルに書き出す。
                         結果として、書き出したテキスト行数n(レコード数)を返す。
                           なお、ファイル名"f"(拡張子.csvを自動的に付ける)を、export[]関数を初期評価するたびに、
                         生成する(既存ファイルへの出力は不可)。

  (6)代行フレームと変数束縛
      > proxy[('a1,'a2,..'an),'b];  フレーム'a1,'a2,..'anの処理をフレーム'bに委託するとき、関数proxy[]で
                                    フレーム'bをフレーム'a1,'a2,..'anの「代行フレーム」に指定し、
                                    結果として、処理を委託したフレームの個数を返します。
                                    フレーム'bの代りに、nilを指定した場合、代行関係を解除します。
                                    なお、フレーム'a1,'a2,..'anまたは'bは、いずれも仮引数を持たないフレーム
                                    とします。
                            (例)a:=10;
                                  b:=20;
                                  c:=30;と定義して、
                                  proxy[('a,'b),'c];を評価して、変数aと変数bを参照すれば、共に30になる。
                                  proxy[('a,'b),nil];を評価すれば、変数aと変数bの値は、元の10と20に戻る。

      > bind['a1,'a2,..'an];         フレーム'a1,'a2,..'anのインスタンス変数値を関数bind[]で束縛し、
                                    結果として、束縛したインスタンス変数のフレーム番号のリストを返します。
                                    なお、フレーム'a1,'a2,..'anは、いずれも仮引数を持たないフレームとします。
                            (例)a:=10;
                                  b:=20;
                                  c:=30;と定義して、
                                  bind['a,'b,'c];を評価すれば、インスタンス変数a,b,cの値は、同じ値をとる。
                                  ここで、c:50;ならば、インスタンス変数a,b,cの値は、いずれも50となる。

      > unbind['a,'a2,..'an];        フレーム'a1,'a2,..'anの束縛関係を関数unbind[]で解除し、
                                    結果として、束縛解除したインスタンス変数のフレーム番号のリストを返します。
                                    なお、フレーム'a1,'a2,..'anは、いずれも仮引数を持たないフレームとします。

      > unify[(a1,a2,..an),(b1,b2,..bn),k1,k2,f1,f2]       リスト(a1,a2,..an)とリスト(b1,b2,..bn)の単一化(unification)
                         論理式を表わすリスト(a1,a2,..an)とリスト(b1,b2,..bn)を単一化(unification)して、その結果(成否)を
                         整数(成功==>正数、失敗==>負数または0)で返します。
                           k1項には、第1引数と第2引数の単一化が成功した直後に、更に追加して起動する手続きを
                         入力します。k1項の評価結果が、関数unify[]の最終結果となります(k1項は省略可)。
                           k2項には、単一化が成功した場合に、第1引数と第2引数に含まれるマスク変数の値をリセット
                       (単一化前の値に戻す)するか否かの整数値を入力します(正数値ならば、リセット)。(k2項は省略可)
                         f1項とf2項は、それぞれ第1引数と第2引数に含まれるマスク変数が帰属するフレーム(名)を指定します。
                         f1項とf2項は、関数unify[]を含むフレーム文に帰属するマスク変数のみで単一化する場合は、省略可。
                         ===> 複数のフレーム文のマスク変数を横断的に単一化する場合に指定します。
                         また、次のシステム変数を参照すれば、関数unify[]の直前の評価結果等を取得することができます。
                           `uf  ... 直前の評価結果が「単一化可能」ならば、正数(マッチ項数)を返す。
                           `ufr ... 直前の評価によって得られる単一化代入例(リスト)を得ることができる。
                         なお、単一化アルゴリズムは、文献5),14)を参考にしています。
                            (例)unify[(1,?a!,3),(1,2,?b!)];ならば、局所自由変数a!とb!は、それぞれ2と3になり、
                                                             正数値3(3項がマッチし、単一化成功)を返す。
                                  unify[(1,?c!,3),(1,?d!,?c!)];ならば、局所自由変数c!とd!は、ともに3になり、
                                                             正数値3(3項がマッチし、単一化成功)を返す。
                                  unify[(1,?e!,3),(1,(2,?e!),3)];ならば、局所自由変数e!が循環参照であるから、
                                                             数値0(単一化不成功)を返す。
                                  unify[(1,?f!,3),(1,2,?g!),if[f!>2,1,-1]];ならば、f!>2の場合をマッチとしているので、
                                                             負数値-1(単一化不成功)を返す。

  (7)その他特殊関数
      > search['(p1,p2,..pn),'(f1,f2,..fn),k];  インスタンス変数値の検索によるフレーム文の探査
                         パターン・リスト'(p1,p2,..pn) とフレーム名リスト'(f1,f2,..fn)のインスタンス変数値を
                         パターン・マッチングして、マッチしたフレーム名のリストを返す。
                         3番目の引数k は、パターン・リスト'(p1,p2,..pn) とフレーム名リスト'(f1,f2,..fn)が
                         マッチとき、更に追加して評価する場合に、その関数を定義・入力する。
                         ===> 3番目の引数k の評価結果が正数(真)の場合、最終的にマッチしたとする。
                       (例)A:=(1,2,3);
                             B:=(2,2,1);
                             C:=(3,3,1); として、
                             search[(2,?,1),'(A,B,C)];を評価すれば、('B)を返す。

      > func['fc,a];     関数名を'fc、引数aとする関数を生成し、その結果を返す。(function)
                         func['add,(1,2)];ならば、関数add[1,2]を返す。

      > nop[x];          引数xを評価せず、引数xそのものを結果として返す。(no_operation)

      > eval[x,'f];      第1引数xの評価結果を、更に評価し、その結果を返す。(evaluate)
                         第2引数'fは、第1引数xの評価結果を、フレーム'fの環境下で更に評価する場合に指定する。
                         なお、'fの代りに、フレーム'fのフレーム番号を入力することができます。
                         'eval/func['add,(1,2)];ならば、結果3を返す。
                          eval[nop[`cf],'f];ならば、フレーム'fの確信度を返す。
                          eval[nop[s!],'f];ならば、フレーム'fの局所自由変数s!の値を返す。

      > init[x!:0,y!:0]; フレーム定義関数において、局所自由変数x!,y!の初期値を 0に設定する。(initialize)
                         再帰処理時の局所変数の初期値設定、局所関数の定義に特に有効です。

      > break[a1,a2,..an]; 関数do[]など逐次評価関数、または、関数while[]など繰返し評価関数において、
                         途中の評価結果を最終評価結果として返したい場合、その最終評価結果を与える引数列を、
                         関数break[]の引数にする。
                         引数列がa1,a2,..anのとき、最後尾anの評価結果を返す。
                         引数が一つの場合は、その評価結果を返す。

      > return[a1,a2,..an]; フレーム定義文の評価において、その評価の途中結果を最終評価結果として返したい場合、
                         その最終評価結果を与える引数列を、関数return[]の引数にする。
                         引数列がa1,a2,..anのとき、最後尾anの評価結果を返す。
                         引数が一つの場合は、その評価結果を返す。

      > exit[a1,a2,..an];   フレーム定義関数を評価する途中で、コントロールをトップレベルに返す場合に使用する(大域脱出)
                        フレーム文を評価するとき、評価途中の結果を、そのフレーム文の最終評価結果と
                        したいとき、exit[ai] を、フレーム文を定義する関数の引数に入れます。
                        また、aiは複数引数とすることができます。この場合、最後尾の引数の評価結果を返します。
                    (例1)フレーム文中に、関数exit["global_exit"] に出会うと、
                           コントロールをトップレベルに移し、"global_exit"; と表示する。
                    (例2)do['a,'exit/(print["exit="],'b),'c]; ならば、
                           コントロールをトップレベルに移し、exit='b; を返す。

      > reptmax[m]      while[]関数の繰返し回数の上限をmに変更する。(repeat_max)
                        この関数で、特に変更しない場合は、255回を上限とする。

      > recurmax[m]     *()関数、&()関数、ユーザー定義関数の再帰呼出し回数の上限をmに変更する。(recursive_max)
                        この関数で、特に変更しない場合は、64回を上限とする。

      > random[n];      0.0〜1.0未満の範囲の乱数を n個生成し、その結果(実数)を返す。n は1〜10000の整数とします。 
                        n を省略した場合は、1個の乱数値を返す。

      > round[a,p];     数値aをパラメータpに従い四捨五入して、その結果を返す。なお、パラメータpの意味は次のとおり
                         p>0のとき、小数以下p+1桁目を四捨五入する。
                         p=0のとき、小数以下を四捨五入して整数値を返す。
                         p<0のとき、(-p)位以下を四捨五入した結果を返す。

      > int[a];         実数aの小数点以下を切りすて、整数に変換し、その結果を返す。(integer)

      > mod[a,b];       数値aを数値bで割った余りを返す。(modulo)

      > sqrt[a];        数値aの平方根を求め、その結果を返す。(square_root)

      > uniq[a1,a2,...an];  引数a1,a2,...anの各要素をくらべ、重複した要素を除いたリストを、結果として返す。(unique)
                            uniq[1,2,2,3]; または'uniq/(1,2,2,3);、ならば、リスト(1,2,3)を返す。

      > sort[(a1,a2,...an),k,s]; リスト(a1,a2,...an)をパラメータ kに従い分類し、その結果を返す。
                               なお、要素a1,a2,..anが、サブリストのときは、サブリストの先頭からs番目の要素を
                              分類キーとみなす(sを省略した場合は、サブリストの先頭の要素を分類キーとみなす)。
                               なお、sが-n(マイナスn)の場合は、サブリストの先頭からn番目までの要素を分類キーとみなす。
                     パラメータ kは、次のとおり。
                       'a または 'ascending ---> 昇順分類
                       'd または 'descending --->  降順分類
                          パラメータ kを省略したときは、昇順分類とする。
                             (例)sort[(3,2,4,1),'a];ならば、リスト(1,2,3,4)を返す。
                                   sort[((3,2),(1,4),(2,1)),'a];ならば、リスト((1,4),(2,1),(3,2))を返す。
                                   sort[((4,3),(3,2),(2,1)),'a,2];ならば、リスト((2,1),(3,2),(4,3))を返す。
                                   sort[((3,2,4,1),(3,2,3,1)),,-3];ならば、リスト((3,2,3,1),(3,2,4,1))を返す。

      > total[((a11,a21,..a1n),(a21,22,..a2n),..),k];
                       行列データ((a11,a21,..a1n),(a21,22,..a2n),..)の行方向に列の計をとり、
                       集約行列データ・リストを、結果として返す。
                       kは、各行データ・リストの先頭からの何個をキー項目とするか、を指定する整数とする。
                       各行データ・リストの先頭からk+1項以降の末項までの数値項を列ごとに集約し、
                       その集約リストの先頭に集約キーをつけたものを集約行リストとした行列データを、
                       結果のリストとして返す。
                         なお、行方向の列数とkが等しい場合は、集約キー項目に、何個の明細行を
                       集約したかの行数を付加したものを、集約行データとした行列データを、
                       結果のリストとして返す。
                  (例1)aa:=('(a,b,c,1,2,3),'(a,a,b,4,5,6.1),'(a,b,c,7,8.0,9),'(a,a,b,10,20,30));と定義して、
                          total[*aa,3]; を評価すれば、結果リスト('(a,a,b,14,25,36.1),'(a,b,c,8,10.0,12))を返す。
                  (例2)aa:=('(a,b,c),'(a,a,b),'(a,b,c),'(a,a,b));と定義して、
                          total[*aa,3]; を評価すれば、結果リスト('(a,a,b,2),'(a,b,c,2))を返す。


===> Top Page

19.おわりに

 本概説書は、「体験版」として、GavaOne言語の処理機能を絞った形で紹介しており、多くの行数を各処理関数の説明に費やしていますが、 GavaOne言語の処理関数は、掲載分以外にも多くのものがあります。 しかし、すべての関数をご紹介するのは、 スクリプト言語としての基本部分を分かりにくくすると思いますので、敢えて掲載しませんでした。



(参考文献) 1) 「新しいプログラミング・パラダイム」井田哲雄編,共立出版,1989/11/10発行 2) 「続新しいプログラミング・パラダイム」井田哲雄・田中二郎編,共立出版,1990/11/25発行 3) 「APLイディオムライブラリー」IBM-APLユーザー研究会編,工学図書,1984/3/25発行 4) 「記号処理」中西正和著,朝倉書店,1978/12/15発行 5) 「Schemeによる記号処理入門」猪俣俊光・益崎真治共著,森北出版, 2003/5/15発行 6) 「心の社会」マーヴィン・ミンスキー著,安西祐一郎訳,産業図書,1990/7/20発行 7) 「コンピュータービジョンの心理」P.H.ウインストン編,白井良明・杉原厚吉訳,産業図書,1972/2発行 8) 「1977 ACM Turing Award Lecture」John Backus,IBM Research Laboratory,San Jose 9) 「JAVA言語」河西朝雄著,ナツメ社,2001/12/3発行 10) 「JAVAプログラミング BlackBook」Steven Holzner著,武藤武志監修,トップスタジオ訳,株式会社インプレス社,2002/3/21発行 11) 「標準JAVA Webデータベースプログラミング」横井与次郎著,秀和システム社,2002/9/20発行 12) 「Javaによるはじめてのアルゴリズム入門」河西朝雄著,技術評論社,2001/7/14発行 13) 「だれでもわかる数値解析入門 −理論とCプログラム−」新濃清志・船田哲男共著,2002/3/1発行 14) 「知識と推論」新田克己著,サイエンス社,2002/6/10発行 Copyright(C) 2011 木村紀介. All rights reserved.