Clojure:让范围和函数返回值

时间:2011-11-18 16:21:26

标签: clojure scope return let

我在解决如何使用“let”形式方面遇到了一些麻烦。在下面的示例中,我想在本地绑定值“cols”,以便稍后在函数中处理它。然而,我注意到,如果我使用“let”函数,则sel-opt-tmp函数将返回一个nil值而不是列表。

(defn sel-opt-tmp []
  (let [cols "test"]))

(prn (sel-opt-tmp))

*上面的代码返回一个nil值。

我理解“let”只绑定函数范围内的值,我不知道是否有办法将值传递给let范围。也许有一些我不知道的“回归”?或者这只是糟糕的设计,在这种情况下我根本不应该使用绑定(这往往会创建很难读取的长链函数)?

2 个答案:

答案 0 :(得分:21)

它返回nil,因为let语句的内容为空(或nil)。尝试:

(let [cols "test"] cols)

将返回cols的值。正如seh所说,let语句将计算其最后一个子表达式的值。

答案 1 :(得分:3)

如您所述,将值传递到范围之外没有这样的问题。 绑定 cols仅在范围内有效,但(:ks cols)的生命周期不受类似限制。 (这就是为什么你有垃圾收集:你可以返回指向数据的值,只要有引用数据,数据就会保持实时。)

如果你从函数中得到nil,那可能意味着cols没有:ks键......或者实际上可能不是地图。由于colsfilter的结果,因此它是一个序列,当:ks关键字用作函数时,它会为非集合返回nil。为了防止这种错误,总是写(cols :ks)而不是(:ks cols)可能是一个有用的约定,这样当你认为地图是别的时候就会出错。