我正在用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命名函数
发布于 2015-08-06 18:47:22
如果要从javascript调用函数,请在函数上使用^:export。
(defn ^:export substr
([s a b]
(.. s (substr a b)))
([s a]
(.. s (substr a))))然后,编译器应该生成该名称,以便您可以从javascript调用它。
发布于 2015-08-06 02:15:40
我是通过将函数导出到JavaScript的Window全局对象来实现的:
(aset js/window "substr" stdlib.string/substr)https://stackoverflow.com/questions/31832639
复制相似问题