2017-06-29 82 views
5

我學習的Clojure,並閱讀有關doseq時,我注意到在official Clojure docdoseq瞭解Clojure的綁定語法

(doseq [x [-1 0 1] 
     y [1 2 3]] 
    (prn (* x y))) 

我的困惑像下面的例子是表達[x [-1 0 1] y [1 2 3]]

這是否意味着一個綁定表達式?我嘗試了一些谷歌搜索的數量,但不能遇到任何描述這種形式的文檔。

有人能幫助我瞭解爲Clojure的結合形式的各種語法交涉?

+2

clojuredocs。 org不是任何形式的clojure文檔的官方來源。這是用戶貢獻的不同質量的示例。該網頁上的唯一官方的就是'doseq'的文檔字符串,它告訴你是讀了'for'的文檔字符串,以瞭解它是如何工作的。我同意,如果'doseq'有它自己的詳盡文檔,但至少它指出你閱讀正確的東西會更好。 – amalloy

回答

8

這是一個「binding form"」,它依次將表達式中的值「綁定」到名稱x,所以它通俗地表示一個表達式,它將名稱綁定到值上,這是「解構綁定表單」的一部分,它綁定名稱複合值的部分,如列表或地圖

術語「綁定」而不是「設置」有助於傳達它在做什麼和在某些其他編程語言中設置變量之間的區別。爲它花費的doseq內的形式來運行時的值,則該名稱被釋放到附接至另一個值。

Clojure中提供任意結構的結合給名字在語言指定名稱(綁定符號)

(doseq [[x1 x2] [[-1 -1] [0 0] [1 1]] 
     y [1 2 3]] 
    (prn (* x1 x2 y))) 

也是綁定表達式雖然顯得稍微深入到數據和受讓人大多數地方價值的任何部分名稱爲第一個向量中的每個項目的兩個值(並假定每個項目中有兩個數字)我非常喜歡this tutorial on destructuring/binding

+0

真的,我就改成與至少兩個數字」 –

+0

感謝這個詳細的解釋序列的序列。它可以幫助! –

2

它就像Java中的嵌套for循環。你也可以做的嵌套「手動」:

(dotest 
    (newline) 
    (println "version 1") 
    (doseq [x [1 2] 
      y [:a :b :c]] 
    (println x y)) 

    (newline) 
    (println "version 2") 
    (doseq [x [1 2]] 
    (doseq [y [:a :b :c]] 
     (println x y)))) 

with results: 
version 1 
1 :a 
1 :b 
1 :c 
2 :a 
2 :b 
2 :c 

version 2 
1 :a 
1 :b 
1 :c 
2 :a 
2 :b 
2 :c 

注意doseq總是返回nil,且僅產生副作用(如打印到屏幕)好。

for表達的行爲類似,但返回值的(懶惰)序列(請注意,我們生成在每個環路中的矢量[x y]):

(newline) 
(println "For generates a (lazy) sequence:" 
    (for [x [1 2] 
     y [:a :b :c]] 
    [x y])) 

與結果:

For generates a (lazy) sequence: ([1 :a] [1 :b] [1 :c] [2 :a] [2 :b] [2 :c]) 
+0

+1描繪替代形式。但是,後並沒有真正回答我的問題。我目前更關注的是Clojure的綁定語法比替代形式,因爲我學習語言,在這個階段uncerstanding語法是我的首要任務。 –