Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以将此ClojureScript转换为JavaScript?_Javascript_Macros_Clojurescript - Fatal编程技术网

是否可以将此ClojureScript转换为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>

我的朋友给我看了一篇使用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))))))
(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脚本解释器。这算不算是“优雅”的宏库?您需要查看一下