是否可以将此ClojureScript转换为JavaScript?

Rya*_*hel 2 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 (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))))))
Run Code Online (Sandbox Code Playgroud)

资料来源:http://swannodette.github.io/2013/07/12/communicating-sequential-processes/

我有点犹豫是否相信如果没有某种宏库的优雅方式就无法做到这一点.我不是在寻找以不同方式执行相同行为的解决方案(例如setTimeout的三个无限循环等),而是与原始具有相同"精神"的解决方案.

Ber*_*rgi 5

来自同一个博客,仅六周后:

昨晚我对JavaScript的并发状态和未来表示了一些沮丧.最后我和David Herman进行了一些反复的讨论,他指出ES6 Generators可以表达Go和core.async的CSP风格.[...]

以下是使用ES6和声命令行设置在Node.js 0.11中工作的最少量代码.[...]洞察力是将发电机与通道相结合.

所以,是的,你需要ES6生成器yield和CSP库(不是内置于JS中),但是你将拥有与原始版本完全相同的精神.

如果ES7获取async/ await语法,您还可以使用基于承诺的通道实现,并且能够使用立即调用的asyncchronous函数表达式(IIAFE)而不是go调用.还可以看看这里.