2013-08-28 62 views
2

clojure中是否有任何方法允许在命名空间中的别处使用let结构中定义的变量?使用外部变量 - clojure

我遇到的问题是我需要let的两个独立的值。

例如,如果我的代码

(defn example [x y z] 
     (let [ 
      xy (* x y) 
      xz (* x z)] 
     xz)) 

有什么办法,我用XY的让利之外?

我还应该注意xy和xz就是这种情况下的例子,真正的数据集是哈希映射,而且我尝试过使用单独的函数来单独获取每个集合,但是由于系统的性质我正在使用这似乎不可能。

+0

澄清一点:一个VAR是Clojure中的一个特定的东西,它是由高清形式创作。你可以在一个let形式中绑定一个var'(do(def hello“world”)(let [a#'hello](alter-var-root a(constant“world!”))(var-get a)) )'但这有限,通常是不正当的。让表单创建绑定,绑定和变量非常不同(并且都不是变量)。 – noisesmith

回答

1

不,根据定义,let中定义的变量只能在其内部可见。如果你需要一个外部变量,也许你应该使用全局定义......但总的来说这不是一个好主意。如何将值作为参数传递给需要它的其他函数?

+1

“......在”let' ...“中定义的变量确实不是变量。他们的价值观永远不会改变,尽管符号可以反弹。 –

2

当你需要从单一功能的多个结果,解构是有用

(defn example 
    [x y z] 
    (let [xy (* x y) 
     xz (* x z)] 
    [xy xz])) 

(defn other-example 
    (let [[xy xz] (example 1 2 3)] 
    (println 'xy xy 'xz xz)))