【问题标题】:Using Clojurescript thread-first macros with Javascript Interop将 Clojurescript 线程优先宏与 Javascript 互操作一起使用
【发布时间】:2015-11-19 21:41:06
【问题描述】:
如果任何必需的表单是 Javascript 互操作的一部分,是否可以使用“线程优先”宏?
例如,如果您想在大小为 10 的范围内对输入进行分组,您可能会有如下内容:
(defn get-size [i]
(-> i
(/ 10)
(.ceil js/Math)))
但是,这并不像将除法后的结果传递给.ceil 那样工作,就好像它是一个函数一样。将最后一个表单放在额外的括号中以尝试将其作为单个函数表达式进行评估似乎也不起作用。
【问题讨论】:
标签:
javascript
clojure
macros
clojurescript
【解决方案1】:
-> 和朋友们并不关心他们操作的表达式是否与互操作有关——他们只将表单视为数据结构并根据简单的规则对其进行转换。
您的示例不起作用的原因是它尝试在以js/Math 作为参数的号码上调用名为ceil 的方法,而不是在号码上调用Math.ceil 方法:
(-> i (/ 10) (.ceil js/Math))
(-> (/ i 10) (.ceil js/Math))
(.ceil (/ i 10) js/Math)
这可行:
(-> i (/ 10) (->> (.ceil js/Math)))
与具有正确参数顺序的匿名函数方法一样:
(-> i (/ 10) (#(.ceil js/Math %)))
对于更复杂的情况,-> 的初始参数比i 更复杂,您可能会发现as-> 非常有用。