用参数评估表单向量

时间:2018-02-05 13:21:11

标签: clojure

我一直在努力找出一个用参数评估表单集合的方法。

示例功能:

(defn x
  [a b c]
  (+ a b c))

我想评估函数x的集合,其中只定义了一些参数,并传递了其他参数,最后得到了集合中x函数求值的产品列表:

(defn y
  [z]
  (map #(eval %) [(x z 1 1) (x z 2 2) (x z 8 64)]))

问题是:当我将eval映射到每个函数时,如何将z作为参数引入集合中的每个函数?这可能吗?

我试图避免将它们全部输入,因为我有许多输入(数百个)我想传递给x,其中我只有一小部分我关心的第二和第三个参数(五个左右)。

有没有更好的方法来实现这一目标?

谢谢!

1 个答案:

答案 0 :(得分:3)

首先,让我们使用更多解释性名称,简化x的定义,而不是使用eval

(defn sum [& xs]
  (apply + xs)) ;; could be inlined instead of a function
(defn sum-with [z]
  (map (partial apply sum)
       [[z 1 1]
        [z 2 2]
        [z 8 64]]))
(sum-with 3)
=> (5 7 75)

但是我认为你的真实世界问题比求和数更复杂,所以我假设你的x函数正在做其他事情并需要一些位置参数,即顺序争论很重要:

(defn transmogrify [this n1 n2 that]
  (+ n1 n2 (* this that)))
(defn evaluate-sums [a b]
  (map (partial apply transmogrify)
       [[a 1 1 b]
        [a 2 2 b]
        [a 8 64 b]]))
(evaluate-sums 3 9)
=> (29 31 99)

因此,如果我理解正确,您可以通过apply函数的参数序列来实现目标。或者更明确地使用args /不使用apply,只需使用map更具体的匿名函数:

(defn evaluate-sums [z]
  (map (fn [[this n1 n2 that]]
         (transmogrify this n1 n2 that))
       [[z 1 1 99]
        [z 2 2 360]
        [z 8 64 -1]]))
  

我试图避免将它们全部输入,因为我有许多输入(数百个)我想传递给x,其中我只有一小部分我关心的第二和第三个参数(五个左右)。

如果你的“固定”参数总是相同的,那么你可以使用variadic arity作为参数的 rest

(defn sum [a b & cs]
  (apply + a b cs))
(defn evaluate-sums [zs]
  (map (fn [[a b & cs]]
         (apply sum a b cs))
       [[1 1 zs]
        [2 2 zs]
        [8 64 zs]]))

zs额外参数的集合/序列。