Clojure 在“中翻转参数”-&燃气轮机&引用;陈述

Clojure 在“中翻转参数”-&燃气轮机&引用;陈述,clojure,functional-programming,lisp,clojurescript,Clojure,Functional Programming,Lisp,Clojurescript,代码后面的代码不起作用,因为re-find接受字符串作为第一个参数,接受正则表达式作为第二个参数 (-> "hello" .toUpperCase (re-find #".$")) 如果我重新找到以下代码,代码将起作用: (defn re-find2 [s r] (re-find r s)) 如果我现在用re-find2替换re-find,我会得到我所期望的:大写的“O” 如何在不包装重新查找的情况下解决此问题?对于此特定情况,您可以使用宏 (->>

代码后面的代码不起作用,因为re-find接受字符串作为第一个参数,接受正则表达式作为第二个参数

(-> "hello"
    .toUpperCase
    (re-find #".$"))
如果我重新找到以下代码,代码将起作用:

(defn re-find2 [s r]
   (re-find r s))
如果我现在用re-find2替换re-find,我会得到我所期望的:大写的“O”


如何在不包装重新查找的情况下解决此问题?

对于此特定情况,您可以使用宏

(->> "hello" .toUpperCase (re-find #".$"))
如果确实需要在作为第一个参数和最后一个参数传递之间切换,则可以链接线程宏:

(-> "hello" .toUpperCase (->> (re-find #".$")))

如前所述,如果所有函数只有一个参数或将结果作为最后一个参数,则可以使用thread last。但是,如果您还有具有多个参数的函数,并且必须将结果传递到不能由->或->>处理的特定位置,那么as->宏可能是您的最佳选择


此宏允许您为每个函数调用的结果指定绑定。由于结果现在具有名称,因此可以控制该参数的位置。看看

啊,是的!但如果最后一个参数形式和第一个参数形式混合在一起,情况会怎样呢。实际上,我之前还有一些表单。toUpperCase是第一个参数表单。请注意,您可能想在第一句话中说相反的话,更像是:re-find接受正则表达式作为第一个参数,接受字符串作为第二个参数。您可能还喜欢
(as->…)
,如果
->
不在这里提供帮助,您不需要执行类似于
re-find2
的操作来解决问题。相反,您可以使用内联lambda
#(重新查找%2%1)
来翻转参数。知道这一点可能对你将来有所帮助。你能把答案标记为有效吗?你的问题已经回答了。干杯