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 列出非零条目_Clojure_Clojurescript - Fatal编程技术网

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)