【问题标题】:compiling snippets of clojure(script) into javascript将 clojure(script) 的片段编译成 javascript
【发布时间】:2016-03-30 05:09:23
【问题描述】:

在 clojurescript 库中哪里可以访问一个函数来将 clojure 的 sn-ps 编译成 js?

我需要它在 clojure(不是 clojurescript)repl 中运行:

(->js '(fn [x y] (+ x y)))
=> "function(x,y){return x+y}" 

【问题讨论】:

    标签: clojure clojurescript


    【解决方案1】:

    从 Clojure REPL 编译代码段

    (require '[cljs.analyzer.api :refer [analyze empty-env]])
    (require '[cljs.compiler.api :refer [emit]])
    
    (let [ast (analyze (empty-env) '(defn plus [a b] (+ a b)))]
      (emit ast))
    
    ;; result
    "cljs.user.plus = (function cljs$user$plus(a,b){\nreturn (a + b);\n});\n"
    

    从 ClojureScript REPL 编译代码段:

    (require '[cljs.js :refer [empty-state compile-str]])
    
    (compile-str (empty-state) "(defn add [x y] (+ x y))" #(println (:value %)))
    
    ;; Output (manually formatted for easier reading)
    cljs.user.add = (function cljs$user$add(x,y){
      return (x + y);
    });
    

    compile-str 将回调作为最后一个参数。它将使用带有包含结果 JS 作为字符串的键 :value 或带有编译错误的 :error 的映射调用。

    在这两种情况下,您的类路径中都需要 org.clojure/tools.reader。

    【讨论】:

    • 太棒了!非常感谢。我看到了那个功能,但不知道空状态。你将如何定义一个特定的命名空间(而不是cljs$user)
    • 哦,等等...我的错...我追求相同的功能,但对于 clojure repl。稍微编辑了问题
    • @zcaudate 我已经用 Clojure REPL 的编译更新了答案
    • 为什么(analyze env '(fn [a b] (+ a b)))返回""?
    • 我猜the comment from the code 解释得很清楚:):“fn 语句被删除,没有任何作用,如果命名会污染范围”。当它们不在语句中时,它们是无操作的,可以忽略。
    【解决方案2】:

    有一个轻量级的替代方案:https://github.com/kriyative/clojurejs,它可以创建问题所要求的正确输出。

    可以在此处查看示例:https://github.com/kriyative/clojurejs/wiki/Examples

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 2013-01-03
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      相关资源
      最近更新 更多