假设你有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)))
我不知道我完全理解你正在尝试做的,但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?