以下で、一応いちから説明しますが、私がよくわかってないので用語など一般的な使い方とはズレているかもしれません。概念のおき方なども標準的でないかもしれません。くわしくはちゃんとしたUnlambdaの解説サイトなどを見るのが早いと思います。
なお、以下の説明の中で、Aやxなどとあるのは、実際に具体的にAやxという文字あるいは項あるいは関数などを言っているのではなくて、例としてAといっているだけですのでご承知ください。
主に、Aなどの大文字は項の例として、またxなどの小文字は関数の例として使っています。
トークン
トークンは次のものがあります。プログラム中にトークン以外の文字があるとエラーになります。ただし空白文字は無視されます。
!
みこ
ぺろ
…
っ
「文字」
『
』
☆
なお、文字は何でもよく、また文字と言っていますが複数の文字からなる文字列であってもかまいません。ただし、鉤括弧を含むことはできません。
関数と項
関数というのは抽象的な存在で、数学でいう関数と同様、「引数xに作用して返値yへと変換する」というような何らかの作用を行うものです。
これは関数型言語ですから、すべての基本になるものは関数です。しかし、関数は抽象的な存在ですから、目で見ることはできません。目で見ることができるのは項です。
項には、以下の2種類があります。
まず、!
以外のトークンは、それ1つだけで項をなします。
みこ
「みこぺろ」
次に、A
とB
が項のとき、これらを用いてAB!
の形に表されているものは項です。
みこぺろ!
みこぺろ…!!
最後の例では、ぺろ…!
が1つの項であることにより、みこぺろ…!!
はAB!
の形にあてはまっていることに注意してください。
項が表す関数
そして、項には、その項が表す関数というものがあります。項はすべて、なんらかの関数を表しているのです。
たとえば、みこ
という項は、みこ関数という関数を表しています。みこ関数というのは関数であり、抽象的なものですから、直接目で見ることができません。その代わりに、具体的なみこ
という項を扱うわけです。
しかし、項が与えられたとき、それが表す関数は、すぐにわかるとは限りません。たとえば、みこぺろぺろみこ!!みこ!!
という項は、これは実はぺろ関数を表すのですが、このことはぱっと見ただけではわかりません。
そこで、項が表す関数がどんなものであるかを求めることが、重要な話題となります。
とはいえ、みこ
のように1つのトークンでできている項については、その項が表す関数を求めることは簡単です。以下の表のように、1対1で決まっているからです。
項 | 項が表す関数 | 関数の副作用 |
みこ | みこ関数 | (なし) |
ぺろ | ぺろ関数 | (なし) |
… | 恒等関数 | (なし) |
っ | っ関数 | (なし) |
「文字」 | 恒等関数 | 文字の表示 |
『 | 恒等関数 | 開き鉤括弧の表示 |
』 | 恒等関数 | 閉じ鉤括弧の表示 |
☆ | 恒等関数 | 改行 |
AB! | (後述) |
一方で、複数のトークンからできている項、すなわちAB!
の形の項が表す関数を求めることは、少し厄介です。
関数の作用
項AB!
が表す関数をzとすれば、zというのは次の手順で得られるものです。
- 項
B
が表す関数を求める。(仮にyとします。)
- 項
A
が表す関数を求める。(仮にxとします。)
- 関数yを引数xに作用させた結果がzである。
前述のように、関数は、引数に対して結果を与えるという作用をもつものです。その作用の仕方は、関数ごとに決まっています。すでに、みこ関数やぺろ関数などいくつかの関数が出てきましたが、これらの関数の作用の仕方というのは、下の表の通りです。
なお、表の中にxのみこ関数などというものがありますが、xというのはあくまで例ですから、これはxにあてはまるものを変えればそれだけ異なった関数があるということです。(たとえば、xがみこ関数ならば、xのみこ関数というのはみこ関数のみこ関数になるし、xがぺろ関数ならば、xのみこ関数というのはぺろ関数のみこ関数になるといった具合です。)
引数 | 作用させる関数 | 作用の結果 |
x | みこ関数 | xのみこ関数 |
x | ぺろ関数 | xのぺろ関数 |
x | 恒等関数 | x |
x | っ関数 | っ関数 |
y | xのみこ関数 | x |
y | xのぺろ関数 | yとxのぺろ関数 |
z | yとxのぺろ関数 | xをzに作用させた結果をuとし、 yをzに作用させた結果をvとして、 uをvに作用させた結果 |
最後のは一見すると難しいですが、ようするに、ABCぺろ!!!
とはAB!AC!!
のことである、と言っているのですね。なお、uとvを求める順番は、上記の通りuが先です。
なお、上記のことからも分かるように、作用の引数というのは1つの関数であるし、また作用の結果(返り値)というのも1つの関数です。つまり、ここで扱っている作用とは、数学的に言えば、関数を関数に変換する作用ということになります。
関数の副作用
中には副作用を持つ関数もあります。具体的には、何か文字を出力するなどです。
副作用は、作用のときに発動します。たとえば、AB!
という項の表す関数を求めようとすると、B
の表す関数を作用させます。このとき、もしB
の表す関数が副作用を持っていたら、発動します。(A
が表す関数は、今はただの引数であり、作用するわけではないので、副作用も発動しません。)
プログラムの実行
プログラムというのは1つの項です。プログラムを実行するというのは、その項が表す関数を求めることです。
この際、前述のような副作用が発生することがあります。たとえば、「みこ」「ぺろ」!
というプログラムを実行すると、出力画面に以下のように表示されます。(作用するのは「ぺろ」
が表す関数であることに注意してください。)
ぺろ