2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面,了解有关如何使用该功能的更多信息。

0
Clojure

这是一个常规 for 函数的输出

(for [x ['a 'b 'c] 
      y [1 2 3]]
  [x y]) 
  ;;=> ([a 1] [a 2] [a 3] [b 1] [b 2] [b 3] [c 1] [c 2] [c 3])

您如何将其转换为接受任意数量参数的变参函数?

示例

    (defn variadic-for
        [& args]
        (for [... ] [...]))
(variadic-for [['a 'b 'c] [1 2 3]])
;;=> ([a 1] [a 2] [a 3] [b 1] [b 2] [b 3] [c 1] [c 2] [c 3])

1 个回答

+2

被选中
 
最佳答案

如果您有未知数量的集合,我认为 for 并不是您所需要的构造。

如果我们查看 for 的定义,我们可以看到它是一个宏,它将每个集合的元素绑定到它们自己的符号。在您的第一个示例中,xy 分别绑定到各自集合的值。唯一可以生成具有动态数量集合(因此是绑定)的 for 调用的方法是为 args 的大小定义一个新的宏,为 args 的每个元素生成一个符号,然后组装一个带有所有绑定的 for 调用。虽然可行,但我怀疑我们可能找到一个更简单的解决方案。

如果您的目标是从每个集合中收集获取每个可能项的每一种方式,可以使用在此处找到的 cartesian-product 函数math.combinatorics 得到。

太棒了,谢谢
...