我已经看到有一些工具可以从clojure构建移动应用程序,但我想知道有关库,环境,缺点,分析和实际工作示例的更多细节
谢谢
我的问题是,使用文档和示例providede我无法理解:key参数的含义或其可能的值这是我所指的函数的官方文档页面:http:
//clojuredocs.org/clojure_core/clojure.核心/加手表
add-watch clojure.core
(add-watch reference key fn)
Run Code Online (Sandbox Code Playgroud)
向watch/atom/var/ref引用添加监视功能.手表fn必须是4个参数的fn:一个键,一个参考,它的旧状态,它的新状态.每当参考的状态可能已被更改时,任何已注册的手表都将调用其功能.如果是代理,则在代理程序的线程上同步调用watch fn,如果是agent或ref,则在任何挂起的发送之前.请注意,在fn调用之前,atom或ref的状态可能已再次更改,因此请使用old/new-state而不是derefing引用.另请注意,可以同时从多个线程调用watch fns.Var观察者仅由根绑定更改触发,而不是线程本地集!每个参考键必须是唯一的,并且可以用于删除带有删除手表的手表,但是被手表机制认为是不透明的.
谢谢
也许使用(<! c)外部go宏的可能解决方案可以用宏及其宏扩展时间来完成:
这是我的例子:
(ns fourclojure.asynco
(require [clojure.core.async :as async :refer :all]))
(defmacro runtime--fn [the-fn the-value]
`(~the-fn ~the-value)
)
(defmacro call-fn [ the-fn]
`(runtime--fn ~the-fn (<! my-chan))
)
(def my-chan (chan))
(defn read-channel [the-fn]
(go
(loop []
(call-fn the-fn)
(recur)
)
))
(defn paint []
(put! my-chan "paint!")
)
Run Code Online (Sandbox Code Playgroud)
并测试它:
(read-channel print)
(repeatedly 50 paint)
Run Code Online (Sandbox Code Playgroud)
我已经在嵌套go中试过这个解决方案并且也可以工作.但我不确定它是不是一条正确的道路
关于这个问题的原因是与另一个问题相关的不是core.async与Clojure原则相反吗?,@ aeuhuea评论说:"在我看来,这会妨碍简单性和可组合性.为什么这不是问题?" 和@cgrand响应"go宏(它的位置)的限制也是一个特性:它强制执行有状态操作的源代码局部性." 但强制你的代码本地化与"complect"不一样?