私は Clojure を初めて使用し、次の Java コードに相当する単純なタスクを実行するために Clojure が必要です。
MappedByteBuffer out = new RandomAccessFile("file", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 100);
ただし、Clojure は動的言語であるため、map() は MappedByteBuffer ではなく DirectByteBuffer を返します。MappedByteBuffer のメンバーである setInt() メソッドを使用したいと考えています。Clojure に DirectByteBuffer の代わりに MappedByteBuffer のメソッドを使用するように指示する方法はありますか?
ありがとう!
ところで、これは私の試みです:
(defprotocol MfileP
(at [this pos])
(get-i [this])
(set-i [this val])
(resize [this size])
(fsize [this]))
(defrecord Mfile [fc buf] MfileP
(at [this pos] (.position buf pos))
(get-i [this] (.getInt buf))
(set-i [this val] (.setInt buf val))
(resize [this size] (assoc this :buf (.map fc FileChannel$MapMode/READ_WRITE 0 size)))
(fsize [this] (.size fc)))
(defn open [path]
(let [fc (.getChannel (new RandomAccessFile path "rw"))]
(let [buf (.map fc FileChannel$MapMode/READ_WRITE 0 (.size fc))]
(Mfile. fc buf))))
Clojure は DirectMapBuffer で .setInt を探しているため、フォーム (set-i) は例外をスローします。