使用Clojurescript线程优先宏与Javascript Interop

时间:2015-11-19 21:41:06

标签: javascript clojure macros clojurescript

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

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

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

然而,这不起作用,因为推测将分割后的结果传递给.ceil,就好像它是一个函数一样。将最后一个表单包装在额外的括号中以尝试将其评估为单个函数表达式似乎也不起作用。

1 个答案:

答案 0 :(得分:4)

->&朋友们不关心他们操作的表达是否与互操作有关 - 他们只将表单视为数据结构,并根据简单的规则对其进行转换。

您的示例无法工作的原因是它尝试在ceil作为参数的数字上调用名为js/Math的方法,而不是调用方法Math.ceil数字:

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

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

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

  4. 这样可行:

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

    具有正确参数顺序的匿名函数方法也是如此:

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

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