clojure函数,让和返回值

Tob*_*ede 4 functional-programming idiomatic clojure

使用let返回var绑定是不明智的吗?

(let [pipeline (Channels/pipeline)]
  (.addLast pipeline "codec" (HttpClientCodec.))
  ;; several more lines like this
  pipeline)
Run Code Online (Sandbox Code Playgroud)

这里的绑定只是关于词法范围(而不是def)并且不会传播不安全吗?

更新 在写这个问题时,我意识到上面的内容很难看.如果在Clojure中有些丑陋的东西你可能做错了.

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

(doto (Channels/pipeline)
  (.addLast "codec" (HttpClientCodec.))) 
Run Code Online (Sandbox Code Playgroud)

pmd*_*mdj 8

let纯粹是词法范围,不会创建var.由let(或loop)创建的本地行为与函数参数完全相同.所以,是的,使用尽可能多的let/ loop定义的本地人,关闭它们等等是安全的.从函数返回本地只是返回它的值,而不是内部表示(实际上在堆栈上,除非关闭) .let/ loop绑定因此也是重入/线程安全的.

顺便说一句,对于具有大量java调用的特定代码示例,您可能需要考虑使用doto替代或另外.http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/doto