努力学习 Clojure 我遇到了以下问题:
setup:图形数据结构的类,使用 addNode [id data] 成员函数创建deftype
并definterface
具有。直接调用时按预期工作,例如(.addNode graph "anItem" 14)
想法:由于字符串标记化和更新图形都消耗大量时间(至少数百万行),我想连续读取和标记文件并将标记列表推送到将执行`(.addNode图 id 数据)部分。
问题:我似乎找不到正确的语法来使代理接受类实例的成员函数作为更新函数。
简化代码(此处删除了命名空间,可能包含拼写错误!):
; from graph.clj
(definterface IGraph
(addNode [id data])
(addNode2 [_ id data]))
(deftype Graph [^:volatile-mutable nodes] ; expects an empty map, else further calls fail horribly
IGraph
(addNode [this id data] (set! nodes (assoc nodes id data)) this)
(addNode2 [this _ id data] (.addNode this id data) this))
; core.clj
(def g (Graph. {}))
(def smith (agent g)) ; agent smith shall do the dirty work
(send smith .addNode "x" 42) ; unable to resolve symbol
(send smith (.addNode @smith) "x" 42) ; IllegalArgumentException (arity?)
(send smith (.addNode2 @smith) "x" 42) ; same as above. Not arity after all?
(send smith #(.addNode @smith) "x" 42) ; ArityException of eval (3)
(send smith (partial #(.addNode @smith)) "x" 42) ; the same
; agent smith, the president is ashamed...
这五行由于各种原因不起作用,而一个简单的
(def jones (agent 0))
(send jones + 1)
; agent jones, this nation is in your debt
成功执行。这应该是可能的,所以我做错了什么?