2013-08-28 58 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)))