gpt4 book ai didi

clojure - 制作非零条目列表

转载 作者:行者123 更新时间:2023-12-03 22:44:24 26 4
gpt4 key购买 nike

说我有这样的功能:

(defn my-f [a & [b]]
(if (nil? b)
(my-other-f a)
(my-other-f a b)))

这当然是一种简化。它是另一个函数的包装函数——实际上 a 是在这个函数内部处理的。
如果可选参数 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 Canvas 元素获取“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]) 

或者
(keep identity [a b]) 

或者
(filter some? [a b]) 

我不知道有任何内置函数接受 varargs 并仅返回非 nil 元素的 seq。你可以创建一个:
(defn non-nils [& args] 
(remove nil? args)

或使用 ignoring-nils 来自 flatland.useful.fn .

关于clojure - 制作非零条目列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36630243/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com