让vs letfn在clojure中定义局部函数?

Art*_*ldt 39 clojure

在实践中,我应该使用letfn与let来定义本地函数吗?那些我想要本地函数和本地非函数的情况呢?

Ray*_*yne 41

如果我需要的只是一个本地函数或2 ...或3 ...我会让它们.如果我需要混合使用函数和非函数,我将使用正常的let.letfning和letting将是一个非常冗长的方式来做到这一点.

但是,如果您需要通过本地函数进行相互递归,则必须以任何方式使用它们.

简短版本:当您认为它看起来更好时,以及方便时使用它们.使用任何一种都没有严格的规则.它们只是Clojure工具箱中的工具.

玩得开心!


mik*_*era 22

通常它使用起来更简单,更简洁let:这样你就可以在一个表单中定义一组函数和非函数,甚至可以参考之前的定义:

(let [f     (fn [x] ....)
      value (reduce f some-collection)
      foo   bar]
  .....)
Run Code Online (Sandbox Code Playgroud)

letfn实际上只有在想要定义递归引用彼此的多个函数时才需要.let在这种情况下不起作用,因为它不支持递归引用.

  • 函数可以用这种方式引用自身:`(fn foo [x] ....(foo ...)...)` (5认同)
  • 请注意,即使对于简单的递归(主体使用自身的函数),letfn 也是必要的。 (4认同)