*Grass [#v6c37ba3]

#contents

*Grass is a grass-planting programming language. [#c1f9ef3f]

Grassは「ちょっと草植えときますね型言語」である。Grassがどういう言語か理解するには、実際の譜例を見るのが早いだろう。以下はGrassで書かれた(あまり洗練されていない)Hello worldである。

 wwvwwwWWWwwWwwWWWWwvwWWwwwWwwvwWwwwWwwvwWWwWWWWWwvwWWWwwwwWWWWwWWWWwWW
 WWWWwWWWWWWWwWWWWWWWwWWWWWWWWwWwwwwwwwwvwWWWwwwwwWWWWWwWWWWWwWWWWWWWwW
 WWWWWWWwWWWWWWWWWwWwwwwwwwvwWWWWwwwwwwWWWWWWwWWWWWWwWWWWWWWwWWWWWWWWWw
 WWWWWWWWWwWwwwwwwwvwWWWWWwwwwwwwWWWWWWWwWWWWWWWWwWWWWWWWWwWWWWWWWWWWwW
 WWWWWWWWWwWwwwwwwwvwWWWWWWWwwwwwwwwWWWWWWWWwWWWWWWWWWwWWWWWWWWWwWWWWWW
 WWWWWwWwwwwwwvwWWWWWWWWwwwwwwwwwWWWWWWWWwWWWWWWWWWwWWWWWWWWWWWwWWWWWWW
 WWWWwWWWWWWWWWWWWWwWwwwwwwwvwWWWWWWWWwwwwwwwwwwWWWWWWWWWwWWWWWWWWWWwWW
 WWWWWWWWWwWWWWWWWWWWWWWwWwwwwwwvwWWWWWWWWWWwwwwwwwwwwwWWWWWWWWWWwWWWWW
 WWWWWWwWWWWWWWWWWWWWwWwwwwwvwWWWWWWWWWWwwwwwwwwwwwwWWWWWWWWWWWWwWWWWWW
 WWWWWWWwWWWWWWWWWWWWWWwWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWwWwwwwwwwvwWWWWW
 WWWWWwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwWWWwwwwwwwwwwwwwwwwwwwWwwWWW
 WWWWWWWWWWWWWWWWWwvwWWwwwwWWWwwwwwwwwwwWWWWwwwwwwwwwwWWWWWwwwwwwwwwwww
 wWWWWWWwwwwwwwWWWWWWWwwwwwwwwwwwWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwvwWWWWWW
 WWWWWWWWWWwwwwwwwWwwvwWWWWwwwwwwwWWWWWwwwWWWWWWwwwwwwwWWWWWWWwwwwwwwwW
 WWWWWWWwwwwwwwwwwwwwwWWWWWWWWWwwwwwwwwwwwwwwvwWWwWWWWWw

*言語仕様 [#yb41e241]

**はじめに [#k25789b9]

もし「ラムダ計算」や「操作的意味論」という術語になじみがあるなら、[[Grassの公式サイト:http://www.blue.sky.or.jp/grass/doc_ja.html]]を参照した方が、この記事を読むよりも早く、正確な理解が得られるだろう。この記事は、関数型言語の経験のない人を想定して書く。

**プログラムの構造 [#sea007fe]

Grassのプログラムは、関数抽象(要するに関数の定義)と関数適用(関数の呼び出し)が並んだ形をしている。関数抽象は、仮引数の宣言と、本体である関数適用の列から成っている。見た目の割に常識的な構造になっていることが分かると思う。

まず関数適用から見てみよう。

**関数適用 [#m484d3fd]

関数適用の構文は以下の通り。

 WWW...(m個)...WWWwww...(n個)...www   (ただしm,nは1以上)

つまり、一個以上のWの後に一個以上のwが続く形をしている。具体的にはWwwwとかWWWwwとか。

正式な構文はこの通りだが、このままでは余りに読み難いので、この記事ではこれをApp(m, n)と略記する。だからWWWwwはApp(3, 2)と書く。

さて、App(m, n)の意味は、「m個前に定義された値を、n個前に定義された値に適用する」だ。手続き型言語の言葉に直すと、「n個前に定義された値を引数として、m個前に定義された値を呼ぶ」となる。「値を呼ぶ」というのを不自然に感じるかもしれないが、後で分かるようにGrassの値は基本的に全て関数なので、それを呼んでいるだけだ。

「n個前に定義された値」とはどういうことかというと、それはGrassの変数の扱いに関連している。Grassの変数は全て無名である。名前が無いので、変数を参照するにはその位置を指定するしかない。具体的には、関数適用の書かれている場所を起点として、その直前で定義された変数を1番、その前を2番、などと参照する。

関数適用が書かれると、それに付随して一つの変数が暗黙に定義され、適用の結果(呼び出しの戻り値)がその変数に保存される。もちろんこの変数も無名である。これによって新しい変数が増えたので、以降の関数適用では変数の番号が一つずつ繰り上がる。

例として、次のような関数適用の並びを考える。

 WWWWWWWWwwwwwwwWwWww

略記法で書くと、

 App(8, 7)
 App(1, 1)
 App(1, 2)

これは、JavaScriptで言えば次のようなコードに対応する。

 var a = ???(???);
 var b = a(a);
 var c = b(a);

???の部分には前に定義された何らかの変数の名前が入る。

**関数抽象 [#w11dab28]

次は関数抽象(関数定義)を見よう。構文は以下の通り。

 www...(n個)...www 関数適用*   (ただしnは1以上)

つまり、wが一個以上続いた後に関数適用が0個以上続いたものが関数抽象だ。例としてはwWWwWWWwとか、wwwWwwとか、wwwwwといったものが考えられる。

最初のwの並びの部分は仮引数の指定に対応している。といっても引数の数だけwを並べるだけだ。例によって仮引数はすべて無名で、第一引数から順に並ぶ。だから最後の引数が最も若い番号で参照されることになる。

これに続く関数適用の並びは関数の本体で、関数が呼ばれたときに左から順番に実行される。関数の戻り値は、一番最後に定義された変数の値になる。つまり、関数本体が空でない場合は本体の最後の関数適用の結果が返り、空の場合は最後の引数がそのまま返る。

関数適用の場合と同様に、関数抽象一つにつき一個の変数が暗黙に定義され、作られた関数がそこに保存される。

例として、次の関数抽象を考える。

 wwwWWWwWWWwwWWw

略記法で書くと、

 www
   App(3, 1)
   App(3, 2)
   App(2, 1)

JavaScriptで考えるとこれは次のような定義に対応する。

 var g = function(a, b, c) {
   var d = a(c);
   var e = b(c);
   var f = d(e);
   return f;
 };

*リンク [#m0750be8]

[[公式:http://www.blue.sky.or.jp/grass/doc_ja.html]]


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS