(rontolisp) docs
← リファレンス

インスタントと UUID

#inst と #uuid が読まれた先の値で、すべてのバックエンドで 同じように動きます。インスタントはオラクルの java.util.Date で、1970-01-01T00:00:00Z からの ミリ秒を保持します。print でも pr でも UTC の #inst "..." と印字され、str はオラクルの toString を UTC で返します(Wed Jan 01 00:00:00 UTC 2020)。UUID はオラクルの java.util.UUID で、#uuid "..." と印字され、str は小文字の綴りを返します。同じ種類の 2 つの 値は、オラクルで = になるときに = です。compare はオラクルと同じ順に並べ(UUID は 2 つの 半分を符号付き long として比べます)、マップやセットは = でキーを見つけます。どちらも コレクションでも関数でもありません。class は :java.util.Date と :java.util.UUID を返し、 class で振り分けるマルチメソッドとプロトコルはこれらのクラスでディスパッチします。 種類の判定は inst? と uuid? が行い、 clojure.instant はタイムスタンプを java.sql.Timestamp や java.util.Calendar にも読みます。

interop の書き方も、すべてのバックエンドで同じ値を作ります。(java.util.Date.) は現在の インスタント、(java.util.Date. ms) と (java.sql.Timestamp. ms) はそのミリ秒のインスタント、 (java.util.UUID. msb lsb) は 2 つの半分からなる UUID です。UUID/randomUUID と UUID/fromString は random-uuid と #uuid と同じ値を返し、 System/currentTimeMillis はエポックからのミリ秒を返します。Date の getTime、setTime (その場で書き換えます)、before、after、compareTo、Timestamp の getNanos、UUID の 2 つの半分と version、variant はどこでも答えます。インタプリタと JVM では、こうした値は Java のメンバーにホストオブジェクトとして渡り((.format sdf (java.util.Date.)))、 そのクラスのほかのメソッドはホストオブジェクトが答えます((.toInstant d))。メンバーが 返したホストの Date や UUID は、こうした値と = になり、並べて比較できます。

名前例結果
inst-ms(inst-ms #inst "1970-01-01T00:00:01Z")1000
random-uuid(uuid? (random-uuid))true
parse-uuid(parse-uuid "1-1-1-1-1")#uuid "00000001-0001-0001-0001-000000000001"
java.util.Date.(java.util.Date. 1000)#inst "1970-01-01T00:00:01.000-00:00"
java.util.UUID/fromString(= (java.util.UUID/fromString "1-1-1-1-1") #uuid "1-1-1-1-1")true
System/currentTimeMillis(integer? (System/currentTimeMillis))true
#inst "2020-06-15T08:20:30.456-00:00" Mon Jun 15 08:20:30 UTC 2020
true (#inst "1999-01-01T00:00:00.000-00:00" #inst "2020-06-15T08:20:30.456-00:00" #inst "2021-01-01T00:00:00.000-00:00")
#uuid "550e8400-e29b-41d4-a716-446655440000" :found

違い

  • class は、ほかの値と同じくキーワードを返します(仕様との差異)。
  • インスタントの str は、タイムゾーンを UTC としたオラクルの toString です。オラクルは JVM の既定のタイムゾーンで答えますが、wasm バックエンドにはタイムゾーンがありません。
  • UUID の 16 進数字は ASCII の数字と英字に限ります。オラクルの UUID.fromString は Unicode の 10 進数字と全角ラテン文字も受け付けます。
  • Java のメンバーが返したホストの java.util.Date、java.sql.Timestamp、java.util.UUID (インタプリタと JVM)はホストオブジェクトのままです。ここで作った値とは、先に置いたほうの equals が決めるとおりに = になり、compareTo で並べて比較でき、inst?、uuid?、 inst-ms も受け付けます(java.time.Instant も同様です)。ただし #<java java.util.Date> と 印字され、マップのキーやセットの要素としては、ここで作った値とは別のものになります。
  • 実行時に計算した文字列を渡す (java.util.Date. s) は拒否します。オラクルが行う非推奨の Date(String) による解析はありません(リテラルの文字列なら、インタプリタと JVM では従来どおり ホストのコンストラクタに届きます)。Date の setTime 以外の変更メソッド(setYear など)は 名前を挙げて拒否します。オラクルの Date はこれらで書き換わります。
  • clojure.instant の Calendar にはホストオブジェクトがありません。Java の メンバーには渡らず、そのクラスのメソッドは名前を挙げて拒否します。wasm では、Date や UUID の メソッドのうちホストだけが答えるもの(toInstant、hashCode)も同じく拒否します。