我有一个协议和几个deftypes在一个工作区内实现它.如何列出实现以下协议的所有deftypes?
我已经找到了从(ns-public)过滤数据的解决方案,但我不喜欢它,因为它使用了一些"魔法"来完成工作,因为我没有找到正确的方法来实现我的目标与满足?并延伸?.
有任何想法吗?
(defprotocol Protocol
(foo[this] "just an interface method"))
(deftype Dummy [] Protocol
(foo[this] "bar"))
(defn implements? [protocol atype] "fn from clojure sources"
(and atype (.isAssignableFrom ^Class (:on-interface protocol) atype)))
(defn list-types-implementing[protocol]
(filter (fn[x] (let [[a b] x]
(when (.startsWith (str a) "->") ; dark magic
(implements? protocol
(resolve (symbol
(.replace (str a) "->" "")))))
))
(ns-publics *ns*)))
(list-types-implementing Protocol) ; => ([->Dummy #'user/->Dummy])
(let [[a b] (first(list-types-implementing Protocol))]
(foo (b)) ; => "bar"
)
Run Code Online (Sandbox Code Playgroud) 我有客户端 - 服务器应用程序(Clojure +环中的后端,使用ClojureScript完成的前端)并且有单元测试,但仅适用于后端.
每次运行'lein test'lein都要编译ClojureScript,因为':hook [leiningen.cljsbuild]'在project.clj中设置.
我可以在没有ClojureScript重新编译的情况下以某种方式运行测试吗?
我正在用clojure和clojurescript开发RIA.后端使用打嗝生成一个结果html,如
(html5
[:head
(include-js "/js/my-cljs-generated.js")]
[:body ... ])
Run Code Online (Sandbox Code Playgroud)
如何在生成的html中将edn(hashmap,vector等)传递给clojurescript,即不进行ajax调用?
我想让打嗝做这样的事情:
(include-edn
"var_name" {:foo :bar}) ; or any other clojure data
Run Code Online (Sandbox Code Playgroud)
并且能够以某种方式从cljs访问传递的edn(例如,通过名称).
目前我的实现有点hacky并且存储在全局js var中
(hiccup/javascript-tag (str "var edn = \""
(pr-str my-clojure-data) "\";"))
Run Code Online (Sandbox Code Playgroud)
在cljs方面确实如此
(jayq/document-ready
(fn []
(if-let [edn (.-edn js/window)]
(do-something-with (cljs.reader/read-string edn))
)
...
)
Run Code Online (Sandbox Code Playgroud)
也许有更多惯用的方法来实现这一目标?