可以Clojure的评估的混合元数函数的链条,如果需要返回部分功能?(Can clojure eva

2019-09-21 03:59发布

假设你有1元数,2的三个功能和3如下:

(defn I [x] x)
(defn K [x y] x)
(defn S [x y z] (x z (y z)))

是否有Clojure的评价的评价函数或成语:

(I K S I I) as (I (K (S (I (I)))))

返回元数2的parital功能?

我正在考虑创建一个可以采取上述简单的函数定义,并将其扩展到多参数数量功能,可以返回部分结果的宏。 我不想创建宏,如果已经有一个内置的或惯用的方式来做到这一点。

这里是扩展宏想什么为实现上述功能:

(defn I
  ([x] I x)
  ([x & more] (apply (I x) more)))

(defn K
  ([x] (partial K x))
  ([x y] x)
  ([x y & more] (apply (K x y) more)))

(defn S
  ([x] (partial S x))
  ([x y] (partial S x y))
  ([x y z] (x z (y z)))
  ([x y z & more] (apply (S x y z) more)))

Answer 1:

我不知道我完全理解你正在尝试做的,但comp功能是做这种“功能链接”你似乎是在谈论有用。 例如:

user> ((comp vec rest list) 1 2 3 4 5)
=> [2 3 4 5]

这相当于:

user> (vec (rest (list 1 2 3 4 5)))
=> [2 3 4 5]

在你的情况,如果你有列表(IKSII)并要评估它作为(I (K (S (I (I)))))我会用(reduce comp ...)但你可以还可以使用(apply comp ...)

user> ((reduce comp [vec rest list]) 1 2 3 4 5)
=> [2 3 4 5]
user> ((apply comp [vec rest list]) 1 2 3 4 5)
=> [2 3 4 5]

您还可能有兴趣在->->>宏。 这些宏窝它们的参数顺序进入下一个参数。 的->宏将巢到下一表达式的第一个位置,而->>宏将巢到下一表达式的最后位置。 如果“接下来的事情”是一个函数,既会表现相同,形成的一种表现(function nested-things-so-far) ,并继续沿。

真的,例子是最好的:

(-> 1 (+ 10) (- 100) inc)
;//Expands to...
(inc (- (+ 1 10) 100))
;//Evaluating in the REPL...
user> (-> 1 (+ 10) (- 100) inc)
=> -88

(->> 1 (+ 10) (- 100) inc)
;//Expands to...
(inc (- 100 (+ 10 1)))
;//Evaluating in the REPL...
user> (-> 1 (+ 10) (- 100) inc)
=> 90

然而,它似乎更喜欢你想要做的事,涉及自动钻营(虽然,再次,我不认为我完全理解),为此,我不知道任何事情预先存在的内置方式。



文章来源: Can clojure evaluate a chain of mixed arity functions and return a partial function if needed?