scheme と java
jsr223というか、javax.script名前空間 に対応している scheme として siscがある
ここでは scheme の文法とかよりは、java との連携(Javaオブジェクトの取り扱い)について記述する
sisc の jar と scheme-engine.jar という scheme(sisc)を jsr223 経由で呼び出すエンジンをクラスパスに追加すれば、 JSR223 経由で scheme を呼び出すことができる
scheme と java オブジェクト
コメントアウト文
「;」 つまり行先頭にセミコロン
import
とりあえず、以下のものは最初の行で宣言しておくといいだろう
(import type-system)
(import oo)
(import s2j)
動作確認
(display "HelloWorld")
でコンソールに出力されるかどうか
オブジェクト指向
基本的にオブジェクト指向言語のオブジェクト操作は言語仕様にはないようだが、大抵の実装には別途用意されているらしい。
siscについても、JavaVM上で実装されている都合上、用意されている
(フィールド インスタンス名)
という感じ
インスタンスとして obj。フィールドとして str だと
(str obj)
という感じ。
メソッドで引数が args とかだと、
(str obj args)
という感じ。
JSR223 オブジェクト
JSR223 用のインターフェイスの readme にあるが、Binding したオブジェクトについては var が用意されている。
例えば、obj として binding しているのであれば、
(var 'obj)
という感じ。
しかし、Java のインスタンスは大抵は大文字/小文字を区別するよね。
という事で、
例えば、Obj として binding しているのであれば、
(var '|Obj|)
という感じ。
なので、そのフィールド str にアクセスするには、
(str (var '|Obj|))
という事になる。
Java のフィールド名
さて、Java のフィールドも大文字/小文字区別するじゃん、フツー。
という事で、先ほどの str が Str とかだった場合どうするのか。
という事で、Java のフィールド名を解決するメソッド(というか演算子というかコマンド)が用意されている。
(generic-java-field-accessor '|Str|)
という感じ。
という事で、Binding された Obj というオブジェクトの Str というフィールドにアクセスするには、
(
(generic-java-field-accessor '|Str|)
(var '|Obj|)
)
となる。
他にはフィールド更新用に
「generic-java-field-modifier」
メソッド用に
「generic-java-method」
とかがある
Java のフィールド名の値を scheme のデータとして使いたい。
今度は、IsBool という Java のブール型のフィールド(Obj という Binding されたオブジェクトのフィールドとする)を仮定して、これを scheme の if で使う事を考えみる
(
(generic-java-field-accessor '|IsBool|)
(var '|Obj|)
)
このままでは、shceme では使えないので、これを scheme として使うのに、(->型 対象) というものがあるので、
(->boolean
(
(generic-java-field--accessor '|IsBool|)
(var '|Obj|)
)
)
という感じで、scheme で使えるようになったので、if 演算子に与えると最終的にはこんな感じ
(if
(eq?
(->boolean
(
(generic-java-field--accessor '|IsBool|)
(var '|Obj|)
)
)
#t
)
(ここは真の式)
(ここは偽の式)
)
というような感じになる。