gpt4 book ai didi

clojure - 是否有一个适配器可以使函数忽略多余的参数?

转载 作者:行者123 更新时间:2023-12-02 18:40:01 27 4
gpt4 key购买 nike

我正在寻找一个 Clojure 函数,我们称之为 anyargs,它允许其函数参数忽略多余的参数。例如,

((anyargs cons) :a [:b :c] :d) ; => (:a :b :c)

如果函数参数有多个参数,最好选择最大的拟合参数。

最佳答案

一种方法是检查函数以查看它需要多少个参数。 This link涵盖了检测这一点的方法。

如果稍微修改该答案,您将获得最大数量的参数:

(defn n-args [f]
(-> f class .getDeclaredMethods last .getParameterTypes alength))

只有当方法数组按参数长度组织时,这才有效,在我的系统上似乎就是这种情况。如果您确实想确定,

(defn n-args [f]
(apply max
(map #(-> % .getParameterTypes alength)
(-> f class .getDeclaredMethods))))

然后你可以写:

(defn anyargs [f]
(let [n (n-args f)]
(fn [& args] (apply f (take n args)))))

这使用了反射,并且它会因可变参数函数而崩溃,但想必您不会将其与可变参数函数一起使用。除了提供一个捕获 ArityException 的包装器并使用越来越少的参数不断重试直到它起作用之外,这是我目前能想到的最好的方法。

关于clojure - 是否有一个适配器可以使函数忽略多余的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22789005/

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