Functional programming clojure函数,let&;返回值

Functional programming clojure函数,let&;返回值,functional-programming,clojure,idioms,Functional Programming,Clojure,Idioms,使用let返回var绑定是否不明智 (let [pipeline (Channels/pipeline)] (.addLast pipeline "codec" (HttpClientCodec.)) ;; several more lines like this pipeline) 这里的绑定仅仅是词法范围(与def相反)吗?传递它不是不安全的吗 更新 在写这个问题时,我意识到上面的问题很难看。如果Clojure的某些东西很难看,那么你可能做错了 我认为这可能是处理上述问题的更为

使用let返回var绑定是否不明智

(let [pipeline (Channels/pipeline)]
  (.addLast pipeline "codec" (HttpClientCodec.))
  ;; several more lines like this
  pipeline)
这里的绑定仅仅是词法范围(与def相反)吗?传递它不是不安全的吗

更新 在写这个问题时,我意识到上面的问题很难看。如果Clojure的某些东西很难看,那么你可能做错了

我认为这可能是处理上述问题的更为惯用的方法(顺便说一句,这使得这个问题没有意义,但仍然是方便的知识)


let
纯粹是词汇范围,不创建变量。由
let
(或
loop
)创建的局部变量的行为与函数参数完全相同。因此,可以安全地使用任意多的
/
循环定义的局部变量,关闭它们,等等。从函数返回局部变量只是返回其值,而不是内部表示(除非关闭,否则它实际上在堆栈上)<因此,代码>让
/
循环
绑定也是可重入/线程安全的


顺便说一下,对于您的特定代码示例,有大量java调用,您可能需要考虑使用<代码> doto < /C> >,或另外。p> 我差点把你打到“doto”:p
doto
并没有让这个问题变得毫无意义,因为使用
doto
的代码版本扩展到与原始版本相同的东西。但它确实告诉您,这样做必须是完全可以的,否则
doto
就不会这样写了!是的,这就是我的意思,也是我为什么把这个问题的答案留给后代的原因:D。习语表达揭示了潜在的结构。
(doto (Channels/pipeline)
  (.addLast "codec" (HttpClientCodec.)))