Scheme on Java

SISCのソース

最近初めてGNU globalというものを使った。 いいね、これ。 あとは簡単にコメントが書き込めるようになっていると完璧。

Macro

マクロって文法を拡張するものだ。確かに強力だ。 マクロのない言語ではイディオムというものがたくさん生まれる。 マクロのある言語では同じ数だけ(以上?)マクロが生まれるに違いない。 一つのマクロ体系を憶えることは一つの言語を覚えることに等しい。で…

Macro

残る問題は清潔なMacroの実装が判らないこと。 要するにパターン言語の実装が判らない。

jscheme

非常に参考になるコードである。 例えばマクロの実装なんてクロージャの延長で作れるだとか、 特殊手続きをeval loopの中に入れるとシンプルになるだとか、 脱出のみのcall/ccなら例外を使って実装できるだとか。

javaCC eclipse

プラグインを見つけた。 http://perso.wanadoo.fr/eclipse_javacc/

メモ

http://dmoz.org/Computers/Programming/Languages/Lisp/Scheme/Implementations/Java-Based/

CPSを律儀に実装

CPS(Continuation Passing Style)とは?登場人物は次の三つ。 処理A 引数B 処理C 実際にやりたいのは「処理Aに引数Bを渡して実行した後、その結果を引数として処理Cに渡して実行する」というものだとする。 function A(arg){ //do something return result; …

元型は完成。

Lambda式も出来たし、マクロを除いて動くようになった。*1 例えば、 > (DEFINE FACT (LAMBDA (N) (IF (EQ N 0) 1 (TIMES N (FACT (MINUS N 1)))))) NIL > (FACT 10) 3628800 なんていう階乗計算が出来ることも確認した。 *1:もちろん、プリミティブは足りな…

やっと。

正しい数値の読み込みが完成した。複素数とかが面倒なので投げていたのだけど、何とか上手くいったらしい。

再び

どうせなら納得の行くものを作りたい。 今度の実装は データ構造はシンプルに 独立した評価器を使用 評価機構を分割して、パス数を多くとる というところに重点を置く。

一応、動いた

「一応」と付けたのは動作が遅すぎるため。項を一つ評価するたびにオブジェクトを生成しているし、最適化らしいことは何もしていないし、……。 少なくともSchemeらしい点は 再帰呼び出しをループとして実現⇒末尾再帰でスタックを消費しない レキシカルスコー…

変数テーブル

;変数テーブルglobal開始 (define x "X") (define incr #t) ;変数テーブルlet開始 (let ((x 0)) (set! incr ;変数テーブルlambda開始 (lambda () (begin (set! x (+ x 1)) x)) ;変数テーブルlambda終了 )) ;変数テーブルlet終了 (incr) ;変数テーブルlambda…

CPS

Schemeの継続を実装するためには継続をオブジェクトとして扱わなくてはならない。そして、継続をオブジェクトとして扱うのならばCPSへの変換として書くのが良いのではないか(というより、他の書き方を思いつかない)。 以下はメモ。 まず、演算の最小要素とし…

Method (and etc.) dispatch

((object 'symbol) args...) => (method args...) => returnValueここではobjectとmethodの双方に対してほぼ等価な構文を利用している。objectはシンボルを受け取り、methodは引数のリストを受け取るという点だけが唯一異なっており、Method dispatchによっ…

オブジェクトの動き

((object 'method) args...) という(最も単純な)構文を思いついた。Javaの構文と結構似ているような気もする。 (define make-closure (lambda (_x) (let ( (x _x) ) (lambda (method . parameter) (cond ( (eq? method 'x) x) ( (eq? method 'setx1) (lambda…

シンボルの扱い

Schemeのシンボルはあくまでもシンボルというデータ型の一つにすぎない。しかし、同時に変数の識別子としても利用されており、評価するとそのシンボルに束縛された値を返すようになっている。 このようにlisp/Schemeでは一つの要素であってもその局面に応じ…

Scheme to Java

SchemeからClassを定義するのなら必然として動的なものになる訳で、プロトタイピングには便利かもしれない。さらに、それをcompileしてJavaに還元する(とか出来たら良いな)。

名前空間

Javaではfieldとmethod(とclass)の名前空間が区別されている*1が、Schemeでは値と関数の名前空間が区別されていない。適当に擦り合わせておいた方が良いだろう。 (class 'classpath)でJavaのクラスを得る。 (object 'field)でobject.fieldを得る。 問題はobj…

クラス階層

Scheme側のデータ型もjava.lang.Objectを継承している。つまり、Scheme Nativeな要素は実装上、同時にJava Nativeなオブジェクトである。この場合、 Scheme Nativeな要素をJavaの継承ツリー上では例外事項として扱い、Java Nativeなオブジェクトとしては扱わ…