简体   繁体   English

编译后不需要的匿名函数

[英]Undesired anonymous function after compile

I'm writing an interface layer with pure functions in ClojureScript, but I'm getting undesired results after compile. 我正在ClojureScript中编写具有纯函数的接口层,但是编译后却得到了不良结果。 Simple parameterized functions work fine. 简单的参数化功能可以正常工作。 The example: 这个例子:

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

... will successfully generate function rev(s){return s.split("").reverse().join(""); } ...将成功生成function rev(s){return s.split("").reverse().join(""); } function rev(s){return s.split("").reverse().join(""); } , while, with more complex parameters, like [sa & [b]] , or with parametric polimorphism, it generates an anonymous function: function rev(s){return s.split("").reverse().join(""); } ,同时使用[sa & [b]]等更复杂的参数,或使用参数化同构,它会生成一个匿名函数:

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

... generates: 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)); } ...生成: 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)); } 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)); } 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)); } . 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)); }

It doesn't even work with (def substr (fn ... instead. How can I force a function to be named with defn ? 它甚至无法与(def substr (fn ...代替。我如何强制使用defn命名defn

Use ^:export on your function if you are going to be calling it from javascript. 如果要从javascript调用函数,请在函数上使用^:export

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

The compiler should then generate the name so that you can call it from javascript. 然后,编译器应生成名称,以便您可以从javascript调用它。

我通过将函数导出到JavaScript的Window全局对象来实现的:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM