最近の更新 (Recent Changes)

2014-01-01
2013-01-04
2012-12-22
2012-12-15
2012-12-09

Wikiガイド(Guide)

サイドバー (Side Bar)

← 前のページに戻る

Lispインタプリターのリファレンス・マニュアル

1. アトム

アトムは、以下のいずれかです。

- 文字列

- 整数

- 英数字

- 四則演算子(+, -, *, /)、比較演算子(=, <>, <=, <, >=, >)

特殊なアトムとして以下があります。

- T : 条件において、真を表します

- NIL : 条件において、偽を表します。

- () : 空リストを表します。

2. リスト

リストは、アトムあるいはリストを()で括ったものです。

コンスセルのドット対は、":"(コロン)で表します。

3. 組み込み関数

(car リスト)

 リストの最初の要素を返します。

(cdr リスト)

 リストの最初の要素以外を返します。

(cons リスト1 リスト2)

 リスト1とリスト2を連結して新たなリストである(リスト1 : リスト2)を作って返します。

(quote リスト)

 リストの中身を評価せずにそのまま返します。

 「'リスト」とシングルクォートをリストに付けた場合、「(qoute リスト)」と同等です。

(atom リスト)

 リストがアトムの場合にはT、異なる場合はNILを返します。

(equla リスト1  リスト2)

 リスト1とリスト2が等しい場合にはT, 異なる場合はNILを返します。

(print リスト)

 リストをプリントアウトします。

(整数演算子 リスト1  リスト2)

 四則演算をリスト1とリスト2で行い結果を返します。

(比較演算子 リスト1  リスト2)

 リスト1とリスト2を比較し、条件が合致すればTを返す。合致しなければNILを返す。

(cond 
      (条件1 実行関数1)
      (条件2 実行関数2)
      ...
      (条件n 実行関数n))

 合致する条件と組になっている実行関数だけを実行します。

 条件が合致しない実行関数は実行されません。

 ひとつの条件に対応する実行関数は一つしか書けないことに注意してください。

(define (関数名 引数 ...) 定義関数)

(define 関数名 λ関数)

(define 変数名 値)

 defineにより、関数やグローバル変数に値や関数定義をバインドできます。

 なお、"(define (関数名 引数 ...) 関数定義)"、シンタックッス・シュガーであり、実際にはλ式に変換されて関数名とバインドされます。

 同じ名前の関数名や変数名を設定すると、最後に設定されたものだけが有効になります。


(λ (パラメタ) 定義関数)

 λ パラメタ 定義関数

 無名の関数を定義します。λ関数を評価するばあいには、λ関数の後にパラメタと対応する値を列挙します。
 詳細は次項を参照してください。


4. λ関数

λ式は、名前のない関数を記述するのに使います。普通lispでは"lambda"を使いますが、このlispでは"λ"を使います。

つまり、他のlisp言語の"lambda"を"λ"に置き換えたものです。

他のlisp言語で"(lambda (x) (+ x 1))"と書くものは、デカルトLisp/λでは "(λ(x) (+ x 1))"と書きます。

さらに、以下の条件の場合には、 1番外側と2番目の括弧と引数の括弧を書く必要がありません。

λ計算理論で使われるλ式にかなり近い形になります。

- λ関数の引数パラメタが 1 から 3 個である。かつ。
- λ関数の引数パラメタの変数名が 英字1文字 である。かつ、
- λ関数の引数パラメタが括弧でくくられていない場合。

(本当は、引数パラメタは1つでもよかったのですが、ここでは3つまで使えるようにしました)

たとえば、以下は同じものです。

((λ(x)(+ x 1)) 1)
λx (+ x 1) 1

λとxはくっついていても大丈夫です。

ラムダ関数を入れ子にすることもできます。

λx λy (/ x y) 3 6
2

これは、以下と同じです。

((λ(x) ((λ(y) (/ x y)) 3)) 6)
2

引数パラメタ変数のxが6, yが 3にバインドされることに注意してください。 λ関数を入れ子にした場合には、与える引数が定義とは逆順にパラメタの引数にバインドされます。

複数のパラメタが一つのラムダに定義されている場合には、順にバインドされます。

λxy (/ x y) 6 3
2

((λ(x y) (/ x y)) 6 3)
2

5. λ関数の拡張予定

このバージョンのデカルトLisp/λでは、λ関数はすべてのパラメタを解決できないとエラーになります。

しかし、近い将来はパラメタが全部解決できなくても、λ関数を返す処理を拡張したいと考えています。

たとえば、次のようなものです。

λx λy (+ x y) 3  →  λx (+ x 3)

このバージョンでは、残念ながらエラーになってしまいます。

λx λy (+ x y) 3
syntax error : λ
NIL

要するに、ネストしたλ式や、λ式にλ式を渡した後に、λ式を返す処理を拡張するということです。