Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Clojure打印机和读取器往返Java类_Java_Serialization_Printing_Clojure_Barcode Scanner - Fatal编程技术网

通过Clojure打印机和读取器往返Java类

通过Clojure打印机和读取器往返Java类,java,serialization,printing,clojure,barcode-scanner,Java,Serialization,Printing,Clojure,Barcode Scanner,我有一个Java类Vector2,我想说服它与Clojure阅读器“玩得很好” (def a (vec2 1 2)) (print-str a) => "#<Vector2 [1 2]>" 实现这种往返功能的最佳方法是什么?您需要为您的类/类型提供print dup和print method多种方法 退房 例: 我想你不想让EvalReader参与进来吧?@Marko:接受建议。它不是专门为外部API设计的,更方便的是REPL和简单的序列化/反序列化。我认为如果将read e

我有一个Java类
Vector2
,我想说服它与Clojure阅读器“玩得很好”

(def a (vec2 1 2))
(print-str a)
=> "#<Vector2 [1 2]>"

实现这种往返功能的最佳方法是什么?

您需要为您的类/类型提供
print dup
print method
多种方法

退房

例:


我想你不想让
EvalReader
参与进来吧?@Marko:接受建议。它不是专门为外部API设计的,更方便的是REPL和简单的序列化/反序列化。我认为如果将
read eval
设置为true,读者将知道如何处理
#=(Vector2.12)
。这似乎只涵盖了编写端。它是如何读取的?
读取字符串
用于读取。基本上,这个多重方法将返回一个字符串格式的s表达式,如
(vec2 1 2)
,当执行该表达式时,将导致创建所需的对象这不是Mikera想要的:他不想
将代码评估到他的对象中;他想读它,就像本地Clojure向量一样。如果是这样的话,你就不能这样做,因为Clojure没有读卡器宏,也就是说,你不能扩展读卡器,除非使用1.4中引入的标记文本。我想
EvalReader
呢?你不需要一个单独的机制。标记文字也可能是一种值得探索的途径。
(= a (read-string (print-str a)))
(import 'java.util.Hashtable)
(defmethod print-method Hashtable [x writer] 
      (binding [*out* writer] 
         (print (let [h  (gensym)] 
                 `(let [~h (Hashtable.)] 
                     ~@(map (fn [i] 
                               `(.put ~h ~(str "\"" (.getKey i) "\"") ~(.getValue i)  ) ) x) ~h)))  ))
(def a (Hashtable.))
(.put a "a" 1)
(.put a "b" 2)
(= a (eval (read-string (print-str a))))