14

我在弄清楚如何使用“让”表单时遇到了一些麻烦。在下面的示例中,我想在本地绑定值“cols”,以便稍后在函数中对其进行处理。然而,我注意到的是,如果我使用“let”,函数 sel-opt-tmp 将返回一个 nil 值而不是一个列表。

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

(prn (sel-opt-tmp))

*以上代码返回一个 nil 值。

我知道“let”只绑定函数范围内的值,我不知道是否有办法将值传递到 let 范围之外。也许有我不知道的“返回”之类的东西?或者这只是糟糕的设计,在这种情况下我根本不应该使用绑定(这往往会创建难以阅读的长链函数)?

4

2 回答 2

23

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

(let [cols "test"] cols)

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

于 2011-11-18T16:45:00.170 回答
3

正如您提到的,在范围之外传递值没有这样的问题。绑定 cols仅在范围内有效,但值的生命周期不受类似限制(:ks cols)。(这就是你有垃圾收集的原因:你可以返回指向数据的值,只要有对它的引用,数据就会保持活动状态。)

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

于 2011-11-18T16:30:41.767 回答