clojure是否可以计算混合算术函数链,并在需要时返回部分函数?
假设您有三个arity 1、2和3的函数,如下所示:clojure是否可以计算混合算术函数链,并在需要时返回部分函数?,clojure,partial,lambda,combinators,arity,Clojure,Partial,Lambda,Combinators,Arity,假设您有三个arity 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的平数函数 我正在考虑创建一个宏,它可以接受上面的简单函数定义,并将它们扩展为可以返回部分结果的多算术函数。如果已经有一种内置的或惯用的方法来实现这一点,我就不想创建宏 以下是展开的
(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的平数函数
我正在考虑创建一个宏,它可以接受上面的简单函数定义,并将它们扩展为可以返回部分结果的多算术函数。如果已经有一种内置的或惯用的方法来实现这一点,我就不想创建宏
以下是展开的宏对上述函数的要求:
(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)))
我不确定我是否完全理解您正在尝试做的事情,但是函数对于您似乎正在谈论的这种“函数链接”非常有用。例如:
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]
在您的情况下,如果您有列表(ik S I)
,并且您希望将其评估为(I(K(S)(I(I)))
,我将使用(reduce comp…
,但您也可以使用(apply comp…
)
您可能还对或宏感兴趣。这些宏将其参数顺序嵌套到下一个参数中。->
宏将嵌套到下一个表达式的第一个位置,而->
宏将嵌套到下一个表达式的最后一个位置。如果“下一件事”是一个函数,则两者的行为将相同,并形成一个(迄今为止嵌套的函数)
表达式,然后继续
事实上,最好的例子是:
(-> 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
然而,您似乎更想做一些涉及自动咖喱的事情(尽管我也不完全理解),因此我不知道任何预先存在的内置方式。也感谢您的回答。因为我对clojure和lisp类型的编程还不熟悉,所以我需要一段时间来摸索,看看它是否能简化我正在做的事情。有时我知道我想做什么,但不知道它叫什么,即使我有一个好的搜索词,clojure的结果也非常有限。只是发现我正在尝试的可能被称为“自动咖喱”是一个很大的帮助。刚刚发现这个,并认为它可能是完美的为您,如果没有其他,至少有帮助。。。
(-> 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