我在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
命名函数?
答案 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)