Java側での利用方法


コンパイル

jkディレクトリでmakeして得られる、
ArgsManager.class TagManager.class
Data.class
Inspector.class InspectorManager.class SelectablePanel.class
JK$FieldGetThread.class JK$FieldSetThread.class
JK$MethodInvokeThread.class JK$MakeInstanceThread.class
JK$ReadThread.class JK$SyncThread.class
JK.class RetObject.class
ObjectElement$ObjectThread.class ObjectElement.class
ObjectTable.class ParseResult.class
Queue.class QueueElement.class Stream.class
をインタフェースを利用するクラスファイルと同じディレクトリにコピーしてください。なお、これらのファイルは、jkディレクトリにある、
JK.java Data.java
ObjectTable.java ObjectElement.java
Queue.java Stream.java
ArgsManager.java TagManager.java RetObject.java
Inspector.java InspectorManager.java
をコンパイルすることにより作成されます。


初期設定

まず、JavaのSocketクラスのインスタンスを作成し、ソケットを用意します。このソケットを、対象となるKLICプログラムと接続するようにします。この接続したソケットに対して、getInputStream() と getOutputStream() を用いて、入出力ストリームを取得し、それらを、JKクラスのコンストラクタに渡すことにより、メッセージインターフェースを扱うインスタンスを作成できます。例えば、以下のようにします。
Socket sock = new Socket("localhost", 9007);
JK jk = new JK(sock.getInputStream(), sock.getOutputStream());
jk.put(Data.Atom("atomicdata");
このようにして、生成したインスタンスに対して、以下に示すようなメソッドを呼び出すことにより、メッセージ通信が行えるようになります。


インタフェースの利用

JKクラスのインスタンスに対して、以下のメソッドを呼び出すことにより、それぞれの操作が行えます。

インタフェースの終了

以下のメソッドを呼び出すことにより、インタフェースは終了します。

データストリーム

データストリームのインタフェースを利用するには、以下のメッセージを利用します。

手続き呼び出し

以下のメソッドを利用することにより、KLICのゴールを利用できます。 例えば、
call("mo", "go", new Data[] {Data.Atom("abc"), Data.Integer(1)});
といった呼び出しの場合、
mo:go(abc, 1, Ret).
といったゴールがリダクションされます。このメソッドの戻り値は、Retに具体化された値となます。このように、与えられた引数最後に、戻り値となる変数を加えたゴールが呼び出され、この変数に具体化された値を得ることが出来ます。

手続き呼び出しで利用するゴールがmain以外のモジュールのゴールである場合、そのゴールが見つからないというエラーが起きて、KLICのプログラムが止まってしまう事があるようです。このような場合は、mainモジュールに、そのゴールを呼び出すダミーゴールを加えて下さい。


Javaでのデータの扱い

Java側でKLICのデータを扱うには、Dataクラスを用います。
このクラスのオブジェクトを用いて、データストリームや、手続き呼び出しを行うことが出来ます。また、KLIC側から利用されるオブジェクトについても、手続き呼び出しの戻り値などでこれらのクラスを利用します。
このクラスのオブジェクトは、KLICのデータと同様、一度作成すると、その値を変更することができませんので、注意して下さい。

データの作成

データの作成は、コンストラクタではなく、以下のクラスメソッドを用いて行います。 例えば、
Data str = Data.String("This is a test.");
Data num = Data.Integer(123);
Data atom = Data.Atom("abc");
Data func = Data.Functor("f", new Data[] {Data.Atom("abc"), Data.Integer(1)});
のようにすることで、データを得ることが出来ます。

値の参照

インスタンスの値を参照するには、以下のメソッドを用います。 インスタンスのデータの種類を得るには、getDataType()を用います。返される int 値は、Data クラスフィールドにある定数、INTEGER, STRING, ATOM, FUNCTOR を用います 。例えば、
if (d.getDataType() == Data.ATOM)
  System.out.println("atom:"+d.getAtomName());
else if (d.getDataType() == Data.INTEGER)
  System.out.println("int :"+d.getInteger());
のように利用します。

その他のオブジェクトメソッド

Dataクラスのインスタンスに対して、以下のメソッドを利用することが出来ます。

その他のクラスメソッド

以下のクラスメソッドを利用することが出来ます。