タプルとリスト
ラムダ計算では 1 つの引数を取って 1 つの値を返す関数しか扱いません。そのため基本的に 1 つの値のみを次々に加工して計算を進めることになります。
タプル
2 つの値をタプルにして 1 つの値として扱うことで複数の値を同時に扱うことが可能になります。
Tuber においては Lisp の伝統に則り、タプルを作る関数 CONS
とタプルの各要素にアクセスする関数 CAR
, CDR
を用意しています。
タプルを作る CONS
CONS
は 2 つの引数から 1 つのタプルを作って返します。
このようにして作ったタプルはあくまでも 1 つの値であるため、関数適用したりラムダ抽象の返り値にすることが可能です。
タプルの各要素にアクセスする CAR
, CDR
CAR
, CDR
を使ってタプルの各要素を取り出せます。
CAR
はタプルを受け取って 1 つめの要素を返します。
CDR
はタプルを受け取って 2 つめの要素を返します。
リスト
タプルを応用すると 2 つ組だけでなく 3 値以上の値の組を扱うことが可能になります。
複数の値を扱うリスト構造について解説します。
値の無いリスト NIL
Tuber には NIL
という値が定義済みです。
NIL
は単体でリストとみなされます。値の無いリスト、要素数が 0 のリストを表現します。
CONS
でリストに値を追加する
リストに値を追加するには CONS
を使います。
例えば 1 つの値 :a
のみを内包したリストは次のように書けます。
1 要素のタプルは、とある値と NIL
のタプルのことです。
CONS
によって次々に値を追加することで 2 要素, 3 要素のリストを次々に作ることが可能です。
とある値とリストを CONS
によって連結したものもまたリストになります。
リストから値を取り出す
リストから値を取り出すにはどうすればいいでしょうか?
タプルによって値を繰り返し連結したものがリストであることを思い出せば、タプルから値を取り出す関数 CAR
, CDR
が使えることがわかります。
空リスト判定 IS_NIL
リストに対する演算が 1 つだけ用意されています。
IS_NIL
は引数として受け取ったリストが空リストかどうか判定し TRUE
または FALSE
を返します。