让vs letfn在clojure中定义局部函数?
在实践中,我应该使用让vs letfn在clojure中定义局部函数?,clojure,Clojure,在实践中,我应该使用letfn与let来定义本地函数吗? 如果我同时需要局部函数和局部非函数,那该怎么办呢?如果我只需要一个或几个局部函数,我就letfn它们。如果我需要定义函数和非函数的混合,我将使用普通的letletfning和leting将是一种非常冗长的方法 但是,如果需要通过局部函数进行相互递归,则必须letfn 简短的版本:当你认为它看起来更好,并且方便的时候使用它们。使用这两种方法都没有硬性规定。它们只是Clojure工具箱中的工具 玩得开心 通常使用let:这样您就可以用一种形式
letfn
与let
来定义本地函数吗?
如果我同时需要局部函数和局部非函数,那该怎么办呢?如果我只需要一个或几个局部函数,我就
letfn
它们。如果我需要定义函数和非函数的混合,我将使用普通的let
letfn
ing和let
ing将是一种非常冗长的方法
但是,如果需要通过局部函数进行相互递归,则必须letfn
简短的版本:当你认为它看起来更好,并且方便的时候使用它们。使用这两种方法都没有硬性规定。它们只是Clojure工具箱中的工具
玩得开心 通常使用
let
:这样您就可以用一种形式定义一组函数和非函数,甚至可以参考以前的定义:
(let [f (fn [x] ....)
value (reduce f some-collection)
foo bar]
.....)
letfn
只有在您想要定义多个递归引用的函数时才真正需要let
在这种情况下不起作用,因为它不支持递归引用。请注意,即使对于简单的递归(主体本身使用的函数),letfn也是必要的。是的!虽然在let形式中,这意味着同一个fn有两个名称(一个名称在let绑定中,另一个名称在fn形式中)或重复相同的名称两次,因此letfn可能更好。如果需要通过局部函数进行相互递归,可以使用命名的局部函数,如(let[f(fn f[x]])