Clojure function/macro应用函数,直到返回非nil的值
目前我有如下代码:Clojure function/macro应用函数,直到返回非nil的值,clojure,Clojure,目前我有如下代码: (defn compute-issue [some args] (or (age-issue some args) (name-issue some args))) (defn compute-issue [some args] (first-not-nil [age-issue name-issue] some args)) ; Where first-not-nil would be something like (defn first-not-nil [fs &
(defn compute-issue [some args] (or (age-issue some args) (name-issue some args)))
(defn compute-issue [some args] (first-not-nil [age-issue name-issue] some args))
; Where first-not-nil would be something like
(defn first-not-nil [fs & args]
(if (empty? fs)
nil
(let [result (apply (first fs) args)]
(if (nil? result)
(recur (rest fs) args)
result))))
更多的问题类型即将出现。
有没有这样的东西:
(defn compute-issue [some args] (or (age-issue some args) (name-issue some args)))
(defn compute-issue [some args] (first-not-nil [age-issue name-issue] some args))
; Where first-not-nil would be something like
(defn first-not-nil [fs & args]
(if (empty? fs)
nil
(let [result (apply (first fs) args)]
(if (nil? result)
(recur (rest fs) args)
result))))
我是新来Clojure的。我是在改造现有的功能吗?clojure.core中有一个类似的功能: 获取一组谓词并返回一个函数f,该函数返回第一个逻辑真值 由其组成谓词之一针对其任何参数返回,否则返回 逻辑错误。请注意,f是短路,因为它将在第一次执行时停止执行 参数,该参数针对原始谓词触发逻辑true结果 关键区别在于
some fn
为实际函数应用程序返回另一个函数,该函数还将丢弃false
结果,这听起来可能是您不想要的。这是表达它的另一种简单方式:
(defn first-not-nil [fs & args]
(first
(for [f fs
:let [r (apply f args)]
:when (some? r)]
r)))
可能使用
recur
?编辑以更正代码,谢谢@danielpuiu我所写的与某些fn之间的一些区别:某些fn处理谓词,因此每次只处理一个参数,它将丢弃“false”响应。但是,就目前而言,我对所有这些都没意见。谢谢!