チュートリアル

ここからは、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ソースコードは、オープンソースの練習という事で整理してリポジトリに上げる予定です。(色々と酷い作りですが・・・)

以上、すっかり夜が更けてしまいました、おやすみなさい。