gpt4 book ai didi

clojure - 函数的参数多种类型

转载 作者:行者123 更新时间:2023-12-04 14:33:41 24 4
gpt4 key购买 nike

我试图延迟各种计算。我有以下形式的功能,

(defn a-fn [a b]
(let [a (if (fn? a)
a
#(identity a))

b (if (fn? b)
b
#(identity b))]
(+ (a) (b))))

这允许我传递 a-fn、一个值或一个返回该值的函数,
(a-fn 1 2)    
(defn x [] 1)
(defn y [] 2)
(a-fn x y)
(a-fn x 2)

我所做的是构建一个函数列表(如上面的函数)来对某些数据进行操作,fns 可能会使用其他 fns 来检索它们的参数,或者在某些情况下,事情不会改变并且它们被赋值为参数。我想知道有没有更好的方法来实现这种行为?

最佳答案

您可以使用 delay force :

user=> (defn a-fn [a b] (+ (force a) (force b)))
#'user/a-fn
user=> (a-fn 1 2)
3
user=> (def x (delay 1))
#'user/x
user=> (def y (delay 2))
#'user/y
user=> (a-fn x y)
3
user=> (a-fn x 2)
3

如果你尝试类似 (delay (prn :hello) 1)要测试计算何时完成,请注意打印 Delay 对象会强制它;所以 (def x (delay ...))是安全的,但输入一个普通的 (delay ...)在 REPL 提示中不是。

关于clojure - 函数的参数多种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7336207/

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