Clojure-let绑定形式
我试图理解如何让绑定在映射的闭包中工作。根据我的理解,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 [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)]