チュートリアル
ここからは、TFLの簡単なチュートリアルになります。
リファレンスやマニュアル等はいずれ書くかもしれませんが、とりあえずこんなもので勘弁してください。
四則演算は、システム関数「+,-,*,/」に、値のリストを与えます。
> +[1,2,3] 6.0 > -[10,5,3] 2.0 > *[2,3,5] 30.0 > /[100,2,5] 10.0
比較演算子は、システム関数「eq,<,>,<_,>_」です、(「<_、>_」は以上以下です、開発の過程で関数名に「=」が使えなくなってしまったので・・・)
trueの場合は 1.0 を、falseの場合は 0.0 を返します。
eq[1,1,2] 0.0 > <[1,2,3] 1.0 > >[3,3,1] 0.0 > <_[1,1,5] 1.0 > >_[3,3,4] 0.0
関数定義は次のように、関数名の後にイコールを付けて、ラムダ式を記述します。例えば、xを引数に取り二倍して返すdouble関数は次のように書きます。
double = x -> *[x,2]
式を記述して確定すると、次のようにS式に展開した結果が表示されます。
double = x -> *[x,2] double = (\x,(*,((x,(2.0,nil)),nil)))
実行する場合は、スペースで区切って値を書けばOKです。
> double 3 [6.0] > double 5 [10.0]
結果をみれば解ると思いますが、関数はリストを返却するため、このまま値として使う事ができません。
> +[3,double 5] [Exception]System function : undefined args - Function `Add` can't calculate Cons
リストの先頭の値を取り出すには、システム関数carを使うか、carの糖衣構文「`」を使います。
> +[3,car double 5] 13.0 > +[3,`double 5] 13.0
また、次のようにして匿名関数を書くこともできます。
> (x -> +[x,100]) 30 [130.0]
条件分岐は、次のように if`( 条件 ) { trueの場合の値 }{ falseの場合の値 }と書きます。
> if`( <[4,5] ) { 10 } { -10 } [10.0] > if`( <[5,4] ) { 10 } { -10 } [-10.0]
多くの関数型言語と同様、ループは再帰処理を使って書きます。例えばリストの長さを返す関数lengthは次のようにして書きます。
> length = l -> if`(isnil l){ 0 }{ +[1,`length cdr l] } length = (\l,(if,(car,((isnil,(l,nil)),((!,(0.0,nil)),((!,(+,((1.0,(car,(length,(cdr,(l,nil))))),nil))),nil)))))) > length [1,2,3] [3.0] > length [1,2,3,4,5] [5.0]
高階関数も作れます、呼び出す時に引数として関数を与えるには、関数名やラムダ式を { } でくくります。
> ten = f -> f 10 ten = (\f,(f,(10.0,nil))) > ten {double} [20.0] > ten {x -> +[x,5]} [15.0] >
最後にスクリプトの書き方を説明します。
--コメントは「--」ではじめて、セミコロンで終わります; --ファイルの読み込みは「##」の直後にファイル名です; ##default.tfl; --スクリプトの場合は、処理やコメントの最後には必ずセミコロンが必要です; double = x -> *[x,2]; --インタプリタはスクリプトをコンパイルすると、main関数を実行します; main = double 1234;
後は先程のサンプルファイルと同様に実行できます。
上のファイルの実行結果は次のようになります(default.tflは結局使用していませんが)
$ ./tfl.jar test.tfl [2468.0]
以上、駆け足ですが、TFLの基本的な文法を紹介しました。
今後はライブラリをもう少し充実させ、文字列処理と入出力もサポートするつもりです。また、Javaのソースコードは、オープンソースの練習という事で整理してリポジトリに上げる予定です。(色々と酷い作りですが・・・)
以上、すっかり夜が更けてしまいました、おやすみなさい。