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

Using Clojurescript thread-first macros with Javascript Interop

如果任何必需的形式是 Javascript 互操作的一部分,是否可以使用 "thread-first" 宏?

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

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

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

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

你的例子不起作用的原因是它试图在数字上调用一个名为 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-> 非常有用。