gpt4 book ai didi

Clojure 合并函数

转载 作者:行者123 更新时间:2023-12-03 23:05:10 27 4
gpt4 key购买 nike

SQL 提供了一个名为 coalesce(a, b, c, ...) 的函数如果它的所有参数都为 null,则返回 null,否则返回第一个非 null 参数。

你会如何在 Clojure 中编写这样的东西?

它将被这样调用:(coalesce f1 f2 f3 ...)哪里fi是表格仅在需要时才应评估 .如 f1非零,则 f2不应该被评估——它可能有副作用。

也许 Clojure 已经提供了这样的函数(或宏)。

编辑 :这是我想出的解决方案(修改自 Stuart Halloway 的编程 Clojure,(and ...) 第 206 页的宏):

(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if c# c# (coalesce ~@rest)))))

似乎工作。
(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if (not (nil? c#)) c# (coalesce ~@rest)))))

固定的。

最佳答案

你想要的是“或”宏。

Evaluates exprs one at a time, from left to right. If a form returns a logical true value, or returns that value and doesn't evaluate any of the other expressions, otherwise it returns the value of the last expression. (or) returns nil.



http://clojuredocs.org/clojure_core/clojure.core/or

如果您只想要 nil 而不是 false,请重写 and 并将其命名为coalesce。

编辑:

这不能作为函数来完成,因为函数首先评估它们的所有参数。这可以在 Haskell 中完成,因为函数是惰性的(对 Haskell 的事情不是 100% 确定)。

关于Clojure 合并函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4086889/

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