descartes-src (ソースパッケージ descartes-src-0.26.0.tar.gz) | 2012-09-09 20:57 |
descartes-win (Windows用バイナリパッケージ descartes-win-0.26.0.zip) | 2012-09-09 20:52 |
会話キャラクター: ツンデレ アプリケーション (会話キャラ:ツンデレ v1.0 for Windows) | 2010-04-29 13:41 |
会話キャラクター: 2人の女の子 ダブルキャラクター (会話キャラクター 2人の女の子 ダブルキャラクター 1.0 for Windows) | 2011-10-02 22:23 |
会話キャラクター: Eliza風英語版 (会話キャラ:Eliza風英語版 v1.0 for Windows) | 2010-05-11 01:06 |
会話キャラクター: 猫耳メイド アプリケーション (会話キャラ:猫耳メイド v1.0 for Windows) | 2010-04-27 21:15 |
会話キャラクター: イライザ風日本語版 (会話キャラ:イライザ風日本語版 v1.0 for Windows) | 2010-04-30 21:53 |
経済指標表示プログラム for Windows (経済指標表示プログラム V1.0) | 2011-08-18 22:04 |
ニュースヘッドライン表示プログラム (ニュースヘッドライン表示プログラム V1.0 for Windows) | 2011-08-16 12:31 |
デカルト言語 example (デカルト言語の例題 example-0.7.0.zip) | 2009-03-01 19:47 |
電力状況表示プログラム for Windows (2011年夏版 全国電力供給状況表示プログラム V1.0) | 2011-08-15 13:25 |
デカルト言語の例題としてLispを作成しました。
名づけてデカルトLisp/λ(Descartes Lisp/λ)です。
恒例ですので、まず、"hello, world"を次に示しましょう。
(print "hello, world")
このデカルトLisp/λを使うとlispの関数とともに、λ式(みたいなもの)が 書けます。
(car '(a b c)) λx (car x) '(a b c) λxyz (* x (+ y z)) 9 8 7 (define (f x) (* x 2)) (define f (λ(x) (* x 2))) (define f λx (* x 2))
λ関数の括弧がかなり省略できるのがわかるでしょうか。
ここで新たに作成したLispの方言は、以下のような特徴や制限を持ちます。
1. 1行ずつプログラムを読み込む。(継続行の入力はできない) 2. リストのドット対は、"."ではなく、":"を使う。 3. 使える組み込み関数は、car, cdr, cons, equal, atom, cond, λ, print, define, 整数演算子、比較演算子 4. ローカル変数は設定と参照はできるが変更はできない。 (副作用がなく参照透明性を持つ。) 5. defineで設定される変数と関数は同じグローバル名空間に設定される。 6. lamda関数を、"λ"と多バイト文字で表現する。 7. λ関数で、括弧を減らす糖衣構文(シンタックスシュガー)を導入する。 8. λ関数の中で実行する関数は一つしか書けない。 λx (関数1)としか書けず、λx (関数1)(関数2)とは書けない。 普通のlispと異なり、(λ (x) (関数1)(関数2))とは書けない。
できるだけシンプルになるようにデザインしました。
λのような多バイト文字を使っているため、システムの文字コードと デカルト言語の文字コードと、lispプログラムの文字コードの3者を 一致させる必要があることに注意してください。
-uオプションとlisp-utf8、あるいは-sオプションとlisp-sjisのいずれか の組み合わせで正しく動作するはずです。
descartes -u lisp-utf8 または descartes -s lisp-sjis
起動した後に以下のようにλが表示されなければなりません。
Descartes Lisp/λ (c) 2010 H.Niwa Ready
λが表示されていなければ文字コードの設定に誤りがあります。
Descartes Lisp/■ (c) 2010 H.Niwa Ready
このDescartes Lisp/λでは以下のようなプログラムを実行できます。
(car '(a b c)) (define f 1) (define f (λ(x) (* x 2))) (define (f x) (* x 2)) ((λ(x y) (* x (+ y 3))) 2 3) λxyz (* x (+ y z)) 9 8 7 λx λy λz (+ x (* y z)) 7 40 3 (define f λx (* x 2)) (f 3)
実行結果を以下に示します。
$ descartes -u lisp-utf8 Descartes Lisp/λ (c) 2010 H.Niwa Ready (car '(a b c)) a Ready (define f 1) 1 Ready (define f (λ(x) (* x 2))) (λ (x) (* x 2)) Ready (define (f x) (* x 2)) (λ (x) (* x 2)) Ready ((λ(x y) (* x (+ y 3))) 2 3) 12 Ready λxyz (* x (+ y z)) 9 8 7 135 Ready λx λy λz (+ x (* y z)) 7 40 3 283 Ready (define f λx (* x 2)) (λ (x) (* x 2)) Ready (f 3) 6 Ready
デカルトLisp/λのラムダ関数は、他のlisp言語の"lambda"を"λ"に置き換えた ものです。
他のlisp言語で"(lambda (x) (+ x 1))"と書くものは、デカルトLisp/λでは "(λ(x) (+ x 1))"と書きます。
それだけでは、あまり面白くもありませんので、さらに、以下の条件の場合には、 1番外側と2番目の括弧と引数の括弧を書く必要がないようにしました。
λ計算理論で使われるλ式にかなり近い形になります。
- λ関数の引数パラメタが 1 から 3 個である。かつ。 - λ関数の引数パラメタの変数名が 英字1文字 である。かつ、 - λ関数の引数パラメタが括弧でくくられていない場合。
たとえば、以下は同じものです。
((λ(x)(+ x 1)) 1) λx (+ x 1) 1
λとxはくっついていても大丈夫です。
実行してみましょう。
((λ(x)(+ x 1)) 1) 2 Ready λx (+ x 1) 1 2 Ready
defineによる関数定義も同様です。
(define f (λ(x)(+ x 1))) (define f λx (+ x 1))
ラムダ関数を入れ子にすることもできます。
λ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
[PageInfo]
LastUpdate: 2010-04-10 11:35:19, ModifiedBy: hniwa
[License]
Creative Commons 2.1 Attribution
[Permissions]
view:all, edit:login users, delete/config:login users