Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让vs letfn在clojure中定义局部函数?_Clojure - Fatal编程技术网

让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]])