理解Clojure绑定语法

时间:2017-06-29 17:41:57

标签: clojure binding jvm

我正在学习Clojure,当我在buildTypes { debug {} releaseApp { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } releaseSdk {} } doseq上注意到如下所示的示例时正在阅读doseq

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

我的混淆是表达式[x [-1 0 1] y [1 2 3]]

这是否表示绑定表达式?我尝试了一些谷歌搜索,但没有遇到任何描述这种形式的文档。

有人可以帮我理解Clojure中绑定表单的各种语法表示吗?

2 个答案:

答案 0 :(得分:8)

这是" binding form",因为它"绑定"表达式中的值依次为名称x。因此,它通俗地表示将名称绑定到值的表达式。这是"解构约束形式的一部分"它将名称绑定到复合值的某些部分,例如列表或映射。

术语"绑定"而不是"设置"有助于传达其在做什么和在其他一些编程语言中设置变量之间的差异。该名称附加到doseq内部表单运行所需时间的值,然后释放该名称以附加到另一个值。

Clojure提供任意结构绑定,以便在指定名称的语言(绑定符号)的大多数位置为值的任何部分指定名称

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

也是一个绑定表达式,虽然它看起来稍微深入数据,并将名称分配给第一个向量中每个项目的两个值(并假设每个项目中有两个数字)我非常喜欢{{ 3}}

答案 1 :(得分: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])