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クラスのインスタンスに対して、以下のメソッドを呼び出すことにより、それぞれの操作が行えます。
インタフェースの終了
以下のメソッドを呼び出すことにより、インタフェースは終了します。
-
- void close()
- メッセージインタフェースを閉じる。同時に、インタフェースに利用しているソケットを閉じる。
データストリーム
データストリームのインタフェースを利用するには、以下のメッセージを利用します。
-
- void put(Data d)
- データストリームを通じて、dに指定されたデータを送信する。
-
- Data get()
- データストリームに送られたデータを受け取る。
このメソッドは、データストリームに送られたデータを返す。データストリームが閉じられた場合には、nullが返される。
手続き呼び出し
以下のメソッドを利用することにより、KLICのゴールを利用できます。
-
- Data call(String module_name, String goal_name, Data args[])
- KLICのゴールを呼び出す。
module_nameに呼び出すゴールのモジュール名を、goal_nameにゴール名を指定する。argsには、ゴールに与える引数を、配列として与える。このメソッドが呼び出されると、KLICでargsに指定された引数に、戻り値用の引数を最後に加えたゴールが呼び出され、この変数に具体化されたデータを返す。
例えば、
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のデータと同様、一度作成すると、その値を変更することができませんので、注意して下さい。
データの作成
データの作成は、コンストラクタではなく、以下のクラスメソッドを用いて行います。
-
- static Data Integer(int num)
- numに指定された整数値を持つデータを作成する
-
- static Data Strinjg(String str)
- strに指定された文字列を持つデータを作成する。
-
- static Data Atom(String atom)
- atomで指定された名前を持つアトムを作成する。
-
- static Data Functor(Strng atom, Data args[])
- atomで指定された主ファンクタ名を持ち、引数として args に指定されたデータを持つファンクタを作成する。
例えば、
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)});
のようにすることで、データを得ることが出来ます。
値の参照
インスタンスの値を参照するには、以下のメソッドを用います。
-
- int getDataType()
- データの種別を取得する。
-
- int getInteger()
- 整数型のインスタンスに対して、その整数値を取得する。
-
- String getString()
- 文字列型のインスタンスに対して、その文字列を取得する。
-
- String getAtomName()
- アトム型のインスタンスに対して、その名前を取得する。
-
- String getFunctorName()
- ファンクタ型のデータに対して、その主ファンクタ名を取得する。
-
- Data[] getFunctorArguments()
- ファンクタ型のデータに対して、その引数にあるデータを配列として取得する。
インスタンスのデータの種類を得るには、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クラスのインスタンスに対して、以下のメソッドを利用することが出来ます。
-
- Data clone(Data d)
- 与えられたデータの複製を作成する。
-
- boolean equals(Object obj)
- 与えられたデータと同じ内容であるか調べる
その他のクラスメソッド
以下のクラスメソッドを利用することが出来ます。
-
- static Data[] ListToArray(Data list)
- リストになっているデータから、要素の配列を作成する
-
- static Data List(Data list[])
- list に指定された配列の各データを要素に持つリストを作成する。
-
- static Data Cons(Data car, Data cdr)
- 引数で指定されたデータを持つコンスセルを作成する。
-
- static boolean isCons(Data d)
- データがコンスセルかどうか調べる
-
- static boolean isNil(Data d)
- データが Nil([]) かどうか調べる
-
- static Data Nil()
- リストの終端を示すアトム "[]"を作成する。