2004-12-01から1ヶ月間の記事一覧

変数テーブル

;変数テーブル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なオブジェクトとしては扱わ…

Scheme on Java

正月にでも真面目に実装してみようかな。という訳でその方針を考えてみる。 Schemeベース データ型、ペア、……など、Scheme Nativeな要素はそれぞれ一つのクラスとして実装 Scheme-Java接続 Java Nativeなオブジェクトは関数として扱う*1 Javaのprimitive値は…

reflection

reflectionのようなことをJavassistで行えば、確実に生のJavaと同じ速度が出せる。ただ、現行のreflectionもJITが効けば充分に速いのだから、Javassistによるメモリ消費が問題になるかもしれない。……それ以前にライセンスの問題があるな。

型と契約

私が考えていた型は「契約をオブジェクト化したもの」だったことに思い至った。

Scheme風実装

Scheme風味のスクリプトをjavaで実装してみた。特徴は以下の通り。 GCはjavaに任せる。 javaのreflectionを多用した。*1 継続は未実装。 *1:displayがjava.lang.System.out.printlnへの参照(とその実行方法)だったり。