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` 的定义,我们可以看到它是一个宏,它将每个集合的元素绑定到它自己的符号。在您的第一个例子中,`x` 和 `y` 被绑定到它们各自集合的值。要生成对 `for` 的调用,该调用具有动态数量的集合(因此绑定),就必须定义一个新的宏,该宏检查 `args` 的大小,为 `args` 每个 元素生成一个符号,然后组合一个调用 `for`,包含所有绑定。这是可行的,但我怀疑我们可以找到一个更简单的解决方案。

如果您的目标是收集从每个集合中取出一个元素的每一种可能的方法,这可以通过 此处找到的 cartesian-product 函数 来实现。

太棒了。谢谢
...