LoginSignup
0
0

More than 5 years have passed since last update.

scheme と jsr223

Last updated at Posted at 2017-08-04

scheme と java

jsr223というか、javax.script名前空間 に対応している scheme として siscがある

ここでは scheme の文法とかよりは、java との連携(Javaオブジェクトの取り扱い)について記述する

siscのマニュアルはここ

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
 )
 (ここは真の式)
 (ここは偽の式)
)

というような感じになる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0