java:handle
(java:handle value text &optional hash order class)
Java に値のない Lisp の値 (シンボル、リストなど) である value を代理する Java オブジェクトを作ります。Java からは text がそのオブジェクトの toString に見えます。class とテキストが同じハンドル同士は equals で等しくなります。オブジェクトの hashCode は hash の下位 32 ビット (指定しなければテキストの hashCode) で、ハンドルは同じクラスのハンドルを order (指定しなければテキスト) で順序付けます。そのためハンドルは java.util.HashMap のキーになり、java.util.TreeSet の中で整列します。Java がハンドルを返すところ (メソッドの結果、配列の要素、コールバックの引数) ではどこでも、java: は value を返します。JVM 専用の java 連携パッケージの一部であり、インタプリタと JVM クラスへのコンパイルの両方で利用できます (WASM バックエンドでは利用できません)。Java 連携ガイドを参照してください。
hashに nil を渡すと、ハンドルはまったく同じvalue(eq) のハンドルとだけ等しくなり、hashCodeはその値の同一性ハッシュになります。このときtextも nil にでき、toStringはObjectと同じくクラス名と 16 進のハッシュで綴られます (my.Cell@1b6d3586)。orderには関数も渡せます。compareToはその関数を値と比較相手のオブジェクトの Lisp の値で呼び、返された実数の符号を答えます。orderが nil のハンドルは何とも順序付けられません。比較相手を順序付けられないとき、また別のclassのハンドルと比べたときは、キャストが投げるのと同じClassCastException(class S cannot be cast to class K) を投げます。classは Java のメッセージがハンドルを呼ぶクラス名で、等価と順序を分けます。クラスの異なるハンドル同士はequalsで等しくならず、比較もできません。- 実数のハンドルは、その数の
java.lang.Numberです。doubleValue(分数はDECIMAL64で割った商)、longValue、intValueを答えます。
文字列でない text (hash があるときの nil を含む)、整数でも nil でもない hash、文字列・関数・nil のいずれでもない order、文字列でも nil でもない class はエラーです: java:handle expects (java:handle value text [hash [order ["class"]]]), got 2。オブジェクトのクラスは am.ik.rontolisp.runtime.RontoJavaHandle (数なら RontoJavaNumberHandle) です。インタプリタも同じクラスを使い、コンパイル済みプログラムはこのクラスを隣に置いて、リフレクションなしでハンドルを作ります。java:view も参照してください。