メッセージインターフェースの使い方
はじめに
このメッセージインターフェースは、ソケットを用いて通信を行います。
ソケットの作成は、メッセージインタフェースでは行わないので、ユーザが独自で作成してください。
接続したソケットを、各言語上のメッセージインタフェースの引数として渡すことにより、
メッセージインタフェースが利用できるようになります。
それぞれの言語での利用法については、以下を参照してください。
KLIC側での利用
コンパイル
jkstream.kl1, wrapstr.kl1, parse.kl1 を実行するプログラムといっしょにコンパイルして下さい。
初期設定
まず、 KLIC の UNIX インターフェースでソケットを作成し、Java側と接続済みのものを用意します。
これに対して、 jkstream:jkstream/2 を用いて、メッセージインタフェースを作成します。
例えば、以下のようになります。
p1 :- unix:unix([bind(inet(9007),Serv]), p2(Serv).
p2(S) :- normal(Serv) | jkstream(JK, Serv), JK = [get(Data)].
このようにして作成したメッセージインタフェースへのストリームに対して、
以下に示すようなメッセージを送ることにより、メッセージ通信が行えるようになります。
メッセージ
以下のメッセージを、作成したストリームに送ることによりそれぞれの操作が行えます。
-
put +Data
データストリームを通じて、Data に指定されたデータを送信する。
-
get -Ret
データストリームに送られたデータを受け取る。
Ret にそのデータが設定される。
データは、normal(Data)の形式で設定される。
また、ソケットが閉じられた場合などは、abnormal(abnormal) が設定される。
-
close
メッセージインタフェース(とソケット)を閉じる。
-
call +ClassName +MethodName +Args -Ret
Javaのクラスメソッドを呼び出す。
Argsには、呼び出すメソッドの引数をリストを用いて指定する。
Retには、メソッド呼び出しの戻り値が normal(Data) の形で設定される。
呼び出しが失敗した場合は、abnormal(abnormal) が設定される。
Java側での利用
コンパイル
JK.java, Data.java, ArgsManager.java, TagManager.java, RetObject.java をコンパイルして利用してください。
初期設定
まず、JavaのSocketクラスのインスタンスを作成し、ソケットを用意します。
接続したソケットから、getInputStream() と getOutputStream() を用いて、入出力ストリームを取得し、それらを、JKクラスのコンストラクタに渡すことにより、メッセージインターフェースを扱うインスタンスを作成できます。
例えば、以下のようにします。
Socket sock = new Socket("localhost", 9007);
JK jk = new JK(sock.getInputStream(), sock.getOutputStream());
jk.put(Data.Atom("atomicdata");
このようにして、生成したインスタンスに対して、各メソッドを呼び出しを行うことにより、メッセージ通信が行えるようになります。
メソッド
-
void put(Data d)
データストリームを通じて、データを送信する。
-
Data get()
データスつロームに送られたデータを受け取る。
-
Data call(String module_name, String goal_name, Data args[])
KLICのゴールを呼び出す。
呼び出されるゴールは、指定されたモジュール名とゴール名を持つものである。
その引数は、argsに指定された引数に、戻り値用の引数を最後に加えたゴールになる。
このメソッドのは、戻り値の引数に具体化されたデータを返す。
-
void close()
メッセージインタフェース(とソケット)を閉じる。
Java側でのデータの扱い
Java側でのデータの扱いは、Data クラスを用います。
データの作成は、コンストラクタではなく、以下のクラスメソッドを用いて行います。
-
Data Integer(int num)
整数型のデータを作成する。
-
Data Strinjg(String str)
文字列型のデータを作成する。
-
Data Atom(String atom)
strで指定された名前を持つアトムを作成する。
-
Data Functor(Strng atom, Data args[])
atomで指定された主ファンクタ名を持ち、変数として args に指定されたデータを持つファンクタを作成する。
-
Data Nil()
リストの終端を示すアトム ”[]” を作成する。
-
Data Cons(Data car, Data cdr)
引数で指定されたデータを持つコンスセルを作成する。
-
Data List(Data list[])
list に指定された配列の各データを要素に持つリストを作成する。
Data クラスのインスタンスに対して、データの内容を参照する場合は、以下のメソッドを用います。
-
int getDataType()
データの種別を取得する。返される int 値は、Data クラスにある定数
Data.INTEGER, Data.STRING, Data.ATOM, Data.FUNCTOR
を用いる。
-
int getInteger()
整数型のインスタンスに対して、その整数値を取得する。
-
String getString()
文字列型のインスタンスに対して、その文字列を取得する。
-
String getAtomName()
アトム型のインスタンスに対して、その名前を取得する。
-
String getFunctorName()
ファンクタ型のデータに対して、その主ファンクタ名を取得する。
-
Data[] getFunctorArguments()
ファンクタ型のデータに対して、その引数にあるデータを配列として取得する。