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实现来完成。

太棒了。谢谢
...