javascript - 将 Clojurescript 线程优先宏与 Javascript Interop 结合使用

标签 javascript clojure macros clojurescript

如果任何必需的形式是 Javascript 互操作的一部分,是否可以使用“线程优先”宏?

例如,如果您想要将输入分组在大小为 10 的范围内,您可能有如下内容:

(defn get-size [i]
  (-> i
      (/ 10)
      (.ceil js/Math)))

但是,这不起作用,因为除法后的结果可能像函数一样传递给 .ceil。将最后一个形式包裹在额外的括号中以尝试将其评估为单个函数表达式似乎也不起作用。

最佳答案

-> & friend 们不关心他们操作的表达式是否与互操作相关——他们只把表格看作数据结构,并按照简单的规则进行转换。

你的例子不起作用的原因是它试图调用一个名为 ceil 的方法,以 js/Math 作为参数而不是调用该方法Math.ceil 关于数字:

  1. (-> i (/10) (.ceil js/Math))

  2. (-> (/i 10) (.ceil js/Math))

  3. (.ceil(/i 10)js/Math)

这会起作用:

(-> i (/ 10) (->> (.ceil js/Math)))

与具有正确参数顺序的匿名函数方法一样:

(-> i (/ 10) (#(.ceil js/Math %)))

对于 -> 的初始参数比 i 更复杂的更复杂的情况,您可能会发现 as-> 非常有用。

关于javascript - 将 Clojurescript 线程优先宏与 Javascript Interop 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33814861/

相关文章:

javascript - 在交互式流程图/ TreeMap 中隐藏未选择的选项

javascript - 根据输入值显示一个 div 并隐藏其他 div

scala - 在 Scala 中将函数文字与 quasiquotes 匹配

clojure - 在clojure源码中,RT代表什么?

clojure - 带有剩余参数的匿名函数抛出 NullPointerException

macros - Elixir 宏和 bind_quoted

macros - 我可以从 Vim 脚本函数中检测 Vim 宏录制模式,并在 Vim 宏录制模式下调用该函数吗?

javascript - 如何将逻辑/数学运算符分配给对象的函数?

javascript - PHP 变量到 node.js

clojure - 写这个的最惯用的 Clojure 方式是什么?