Clojure-let绑定形式

Clojure-let绑定形式,clojure,Clojure,我试图理解如何让绑定在映射的闭包中工作。根据我的理解,let后面是一个向量,其中第一项是我想要绑定的符号,后面是我想要绑定的值。所以 (let [a 1 b 2] a) 将给出一个值为1的值 所以如果我声明map,比如 (def people {:firstName "John" :lastName "Doe"}) 我想绑定密钥firstName,那么这将是一个简单的“Hello Person”的正确形式 这是可行的,但是在Clojure的网站上,他们展示了一种不同的形式,这也是可行的 (

我试图理解如何让绑定在映射的闭包中工作。根据我的理解,let后面是一个向量,其中第一项是我想要绑定的符号,后面是我想要绑定的值。所以

(let [a 1 b 2] a) 
将给出一个值为1的值

所以如果我声明map,比如

(def people {:firstName "John" :lastName "Doe"})
我想绑定密钥firstName,那么这将是一个简单的“Hello Person”的正确形式

这是可行的,但是在Clojure的网站上,他们展示了一种不同的形式,这也是可行的

(let [{personName :firstName} people] (str "hello " personName))

这两个代码片段都能工作,我理解为什么第一个版本可以工作,但我对第二个版本的语法感到困惑。这只是一种句法上的糖分,还是一种重复的工作方式,是一种比另一种更地道的方式

最后一种形式是映射绑定分解。如果要将多个变量绑定到同一映射的不同元素,则此选项非常有用:

(let [{firstName :firstName lastName :lastName address :address} people]
    (str "hello " firstName " " lastName ", I see you live at " address))
如果您要使用前面的语法将其写出来,它将是:

(let [firstName (:firstName people) lastName (:lastName people) address (:address people)]
    (str "hello " firstName " " lastName ", I see you live at " address))
正如您所看到的,这样您就不必在每个绑定中重复
people
。如果映射是计算的结果,它可以避免将变量绑定到该映射,这样您就可以重复它

解构还允许您以与正在访问的数据结构类似的格式布置绑定构造。这使得它对于复杂的结构更为惯用。

只是为了清楚(我希望不要太迂腐)

您没有将密钥
:firstname
绑定到任何内容;您正在将标识符
personName
绑定到关键字
:firstname
的应用程序,作为映射
人员的函数

您正在分解映射
人员
,将标识符
人名
绑定到其键
:firstname
处的值


PS

这个奇迹是由
let
表单调用的函数实现的。看看它的作用会有帮助。比如说,

(destructure '[{personName :firstName} people])
;[map__779
; people
; map__779
; (if
;  (clojure.core/seq? map__779)
;  (clojure.lang.PersistentHashMap/create (clojure.core/seq map__779))
;  map__779)
; personName
; (clojure.core/get map__779 :firstName)]

我接受了这个想法

请参阅您链接到的文档中有关映射绑定解构的部分。您的映射中没有键
:name
。很抱歉我将键命名错误。user2766755,您可以对其他数据结构执行类似操作:
(def x[5 10])(let[[x1 x2]x](*x1 x2))=>50
。有些人觉得映射绑定解构语法有点奇怪,因为键在它们限定的局部变量之后。(例如,我觉得是这样。)然而,总的来说,“键秒”语法似乎更有用,这是有原因的。是关于这个问题的一种讨论。一种更简短的分解地图的方法是:
(让[{:keys[firstName-lastName-address]}people](println-firstName-lastName-address))
(let [personName (:firstName people)] (str "hello " personName))
(let [{personName :firstName} people] (str "hello " personName))
(destructure '[{personName :firstName} people])
;[map__779
; people
; map__779
; (if
;  (clojure.core/seq? map__779)
;  (clojure.lang.PersistentHashMap/create (clojure.core/seq map__779))
;  map__779)
; personName
; (clojure.core/get map__779 :firstName)]