是否可以将此ClojureScript转换为JavaScript?
我的朋友给我看了一篇使用ClojureScript宏的博客文章,他声称提供的代码无法优雅地转换为JavaScript,因为JavaScript在语言中缺乏宏支持。具体来说,此代码段中的是否可以将此ClojureScript转换为JavaScript?,javascript,macros,clojurescript,Javascript,Macros,Clojurescript,我的朋友给我看了一篇使用ClojureScript宏的博客文章,他声称提供的代码无法优雅地转换为JavaScript,因为JavaScript在语言中缺乏宏支持。具体来说,此代码段中的go宏在JavaScript中是不可能的 (def c (chan)) (defn render [q] (apply str (for [p (reverse q)] (str "<div class='proc-" p "'>Process " p "</div>
go
宏在JavaScript中是不可能的
(def c (chan))
(defn render [q]
(apply str
(for [p (reverse q)]
(str "<div class='proc-" p "'>Process " p "</div>"))))
(go (while true (<! (timeout 250)) (>! c 1)))
(go (while true (<! (timeout 1000)) (>! c 2)))
(go (while true (<! (timeout 1500)) (>! c 3)))
(defn peekn
"Returns vector of (up to) n items from the end of vector v"
[v n]
(if (> (count v) n)
(subvec v (- (count v) n))
v))
(let [el (by-id "ex0")
out (by-id "ex0-out")]
(go (loop [q []]
(set-html! out (render q))
(recur (-> (conj q (<! c)) (peekn 10))))))
(def c(chan))
(定义渲染[q]
(应用str)
(适用于[p(反向q)]
(str“Process”p“))
(go(虽然为真(!c1)))
(go(虽然为真(!C2)))
(go(虽然为true(!c3)))
(defn peek)
“从向量v的末尾返回(最多)n个项的向量”
[v n]
(如果(>(计数v)n)
(子向量v(-(计数v)n))
v) )
(让[el(通过id“ex0”)
out(按id“ex0 out”)]
(go(循环[q[]]
(设置html!输出(渲染q))
(重现(->)(联合q(
资料来源:
我有点犹豫不决,不相信没有某种优雅的宏库就无法实现。我不是在寻找一种以不同方式实现相同行为的解决方案(如三个无限循环setTimeout等),而是一种与原始解决方案具有相同“精神”的解决方案。来源:
昨天晚上,我表达了对美国的现状和未来的一些失望
JavaScript中的并发性。我最终得到了一点back和and
大卫·赫尔曼指出ES6发电机可以
express Go和core.async的CSP风格。[…]
下面是在Node.js 0.11中工作的少量代码
使用ES6 harmony命令行设置。[…]重点是
将生成器与通道组合
因此,是的,您将需要能够生成的ES6生成器,以及一个CSP库(不内置于JS中),但这样您将拥有与原始版本完全相同的精神
如果ES7获得async
/await
语法,您还可以使用基于承诺的通道实现,并能够使用立即调用的async
同步函数表达式(IIAFE)除了调用go
之外,您还可以查看一下。您可以随时启动clojure脚本解释器。这算不算是“优雅”的宏库?您需要查看一下