clojure 函数,左值和返回值

Posted

技术标签:

【中文标题】clojure 函数,左值和返回值【英文标题】:clojure functions, let & return values 【发布时间】:2011-07-22 21:09:14 【问题描述】:

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

(let [pipeline (Channels/pipeline)]
  (.addLast pipeline "codec" (HttpClientCodec.))
  ;; several more lines like this
  pipeline)

这里的绑定是否只是词法范围(与 def 相对)而不是不安全的传递?

更新 在写这个问题时,我意识到上面的内容很丑陋。如果 Clojure 中有什么丑陋的地方,那么你可能做错了。

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

(doto (Channels/pipeline)
  (.addLast "codec" (HttpClientCodec.))) 

【问题讨论】:

doto 并没有真正让这个问题变得毫无意义,因为使用 doto 的代码版本扩展为与原始版本相同的内容。但它确实告诉你这样做一定没问题,否则doto就不会这样写了! 是的,这就是我的意思,以及为什么我将问题的答案留给后代:D。惯用的表达方式揭示了底层结构。 【参考方案1】:

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

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

【讨论】:

我差点打败你到“doto”:P

以上是关于clojure 函数,左值和返回值的主要内容,如果未能解决你的问题,请参考以下文章

C语言 啥叫做左值?右值?

重新理解C11的右值引用

java Comparator中的返回值和排序有啥关系啊,求解释!!!!!

C++ 函数透明地采用左值和右值参数

为啥我不能将 const 左值引用绑定到返回 T&& 的函数?

为啥这个函数在给定右值参数的情况下返回一个左值引用?