Clojure 列出非零条目
假设我有这样一个函数:Clojure 列出非零条目,clojure,clojurescript,Clojure,Clojurescript,假设我有这样一个函数: (defn my-f [a & [b]] (if (nil? b) (my-other-f a) (my-other-f a b))) 这当然是一种简化。它是另一个函数的包装函数——实际上,一个函数是在这个函数中处理的。 如果可选参数b未传递给my-f,则也不应传递给my-other-f 我在想另一种方法来实现这一点: (defn my-f [a & [b]] (apply my-other-f (make-list-
(defn my-f [a & [b]]
(if (nil? b)
(my-other-f a)
(my-other-f a b)))
这当然是一种简化。它是另一个函数的包装函数——实际上,一个函数是在这个函数中处理的。
如果可选参数b未传递给my-f,则也不应传递给my-other-f
我在想另一种方法来实现这一点:
(defn my-f [a & [b]]
(apply my-other-f (make-list-of-not-nil-entries a b)))
是否有一个内置的函数来完成这项工作
示例 有时候,过于抽象会让人困惑,所以我在这里提供真实的案例。下面的ClojureScript代码起作用,其目的显然是尝试不同的浏览器特定选项,以便从HTML画布元素中获取“webgl”上下文
(defn create-ctx [canvas & [options]]
(some (if options
#(.getContext canvas % (clj->js options))
#(.getContext canvas %))
["webgl" "experimental-webgl" "webkit-3d" "moz-webgl"]))
给定的Canvas元素的方法getContext实际上等待一个参数和另一个可选参数。上述包装函数具有相同的算术性
我只是想看看,是否有一种快速的方法可以避免1和2 arity函数调用的显式切换。我认为您的第一个解决方案更具可读性,更明确地表达了它的意图。它的性能也将比使用
apply
的要好得多
如果仍要使用apply
,则使用clojure.core
的最短解决方案是:
(remove nil? [a b])
或
或
我不知道有哪个内置函数接受varargs并只返回非nil元素的seq。您可以创建一个:
(defn non-nils [& args]
(remove nil? args)
或者从
flatland使用。有用。fn
是否可以为my-f
使用不同的算术<代码>(定义my-f([a](my-other-fa))([ab](my-other-fab))。这看起来确实是个设计问题。例如,如果您有3个参数fn:(defn my-f[ab c])
和可选的b
和c
,并且b==nil
,则删除nil的方法将通过c
而不是b
<代码>(my-f 1 nil 100)。。
(filter some? [a b])
(defn non-nils [& args]
(remove nil? args)