Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure function/macro应用函数,直到返回非nil的值_Clojure - Fatal编程技术网

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”响应。但是,就目前而言,我对所有这些都没意见。谢谢!