编译后不受欢迎的匿名函数

时间:2015-08-05 12:32:35

标签: clojurescript

我在ClojureScript中编写了一个带有纯函数的接口层,但是在编译之后我得到了不希望的结果。简单的参数化功能工作正常。例子:

(defn rev [s]
  (.. s (split "") (reverse) (join "")))

...将成功生成function rev(s){return s.split("").reverse().join(""); },而使用更复杂的参数(如[s a & [b]])或参数化的多向性,它会生成匿名函数:

(defn substr
  ([s a b]
    (.. s (substr a b)))
  ([s a]
    (.. s (substr a))))

...生成:function (s,a,b){ switch(arguments.length){ case 2: return substr__2.call(this,s,a); case 3: return substr__3.call(this,s,a,b); } throw(new Error('Invalid arity: ' + arguments.length)); }

它甚至不适用于(def substr (fn ...。如何强制使用defn命名函数?

2 个答案:

答案 0 :(得分:1)

如果您要通过javascript调用它,请在您的函数上使用^:export

(defn ^:export substr
  ([s a b]
    (.. s (substr a b)))
  ([s a]
    (.. s (substr a))))

然后编译器应该生成名称,以便您可以从javascript调用它。

答案 1 :(得分:0)

我是通过将函数导出到JavaScript的Window全局对象来完成的:

(aset js/window "substr" stdlib.string/substr)