解构可以用在宏或者函数的参数列表中,用于将集合中的某些部分提取到局部绑定变量中。解构也可以用在let特殊形式或者bingding宏所创建的绑定变量中。
假设我们定义的某函数接受一个向量或者列表作为参数,需要返回第一个和第三个子元的和。如下所示:
(defn approach1 [numbers]
(let [n1 (first numbers)
n3 (nth numbers 2)]
(+ n1 n3)))
; Note the underscore used to represent the
; second item in the collection which isn't used.
(defn approach2 [[n1 _ n3]] (+ n1 n3))
(approach1 [4 5 6 7]) ; -> 10
(approach2 [4 5 6 7]) ; -> 10
"&"符合可以被用在解构中,用于捕获在一个集合中的剩下的所有元素,如下所示:
(defn name-summary [[name1 name2 & others]]
(println (str name1 ", " name2) "and" (count others) "others"))
(name-summary ["Moe" "Larry" "Curly" "Shemp"]) ; -> Moe, Larry and 2 others
:as关键词可用于持有对正在被解构的整个集合的访问指针。比如定义一个接受一个向量或者列表作为参数并返回其第一个和第三元素的和与所有元素总和的比值:
(defn first-and-third-percentage [[n1 _ n3 :as coll]]
(/ (+ n1 n3) (apply + coll)))
(first-and-third-percentage [4 5 6 7]) ; ratio reduced from 10/22 -> 5/11
解构也可以被用于从map中提取值。定义一个函数,该函数接受一个map作为参数,该map记录了每个月的销售额,键表示月份,值表示该月的销售额。函数用于求夏季的销售额占当年销售额的比值,如下:
(defn summer-sales-percentage
; The keywords below indicate the keys whose values
; should be extracted by destructuring.
; The non-keywords are the local bindings
; into which the values are placed.
[{june :june july :july august :august :as all}]
(let [summer-sales (+ june july august)
all-sales (apply + (vals all))]
(/ summer-sales all-sales)))
(def sales {
:january 100 :february 200 :march 0 :april 300
:may 200 :june 100 :july 400 :august 500
:september 200 :october 300 :november 400 :december 600})
(summer-sales-percentage sales) ; ratio reduced from 1000/3300 -> 10/33
通常会使用和相应关键词匹配的局部绑定变量的名称进行map的结构。例如我们在上文中使用的{june :june july :july august :august :as all},可以用keys进行简写,如{:keys [june july august] :as all}。
分享到:
相关推荐
在Clojure中实现遗传算法的框架是一个有趣且富有挑战性的任务,因为Clojure是一种功能编程语言,它提供了独特的视角和工具来处理这类问题。遗传算法(Genetic Algorithms, GA)是一种模拟自然选择和遗传学原理的优化...
Clojure鼓励开发者尝试在其他语言中过于复杂而通常不会尝试的事情,例如并发编程、不可变性和惰性数据结构。因为Clojure运行在Java虚拟机(JVM)之上,开发者可以继续使用熟悉的平台、库和工具。 Clojure语言中的...
clojure, 在Clojure中,Exercism练习 Exercism Track Clojure中的Exercism练习贡献指南请参见贡献指南。 Clojure iconClojure logo 是由富Hickey拥有的。 我们使用它来识别Clojure语言本身,而不是Exe
Clojure的设计目标是提供一个高效、并发、可移植的环境,适合解决现代软件开发中的复杂问题。在这个“Clojure编程乐趣”中,我们将深入探讨Clojure的核心概念和特性。 首先,Clojure强调函数式编程,这意味着程序被...
- **纯函数**: 在Clojure中,函数被认为是“纯”的,即对于相同的输入总是返回相同的结果,不受外部环境的影响。这种设计简化了调试和测试过程。 - **不变性数据结构**: Clojure的数据结构是不可变的,这有助于提高...
component, 在Clojure中,有状态对象的托管生命周期 组件'组件'是一个用于管理具有运行时状态的软件组件的生命周期和依赖性的微小Clojure框架。这主要是一个带有几个 helper 函数的设计 Pattern 。 它可以被看作是...
本书共200页,主要介绍了Clojure作为一种现代编程语言的独特魅力及其在实际开发中的应用技巧。 **Clojure**是一种基于Java虚拟机(JVM)的动态语言,它结合了多种优秀特性,使其成为一种非常有吸引力的选择。以下是...
Selmer, 在Clojure中,一个快速Django 启发的模板系统 Selmer 一个快速的 Django 插件,为Clojure激发模板系统。安装命令行 Leiningen 备忘文档备注文档用法 跳转到筛选器内置过滤器add count count? not-empty f
书中详细介绍了Clojure的语法特性,如S表达式(S-expressions)、宏(macros)和动态类型系统。S表达式是Clojure代码的基本形式,它提供了简洁的表示方式和强大的抽象能力。宏允许程序员在编译时进行代码操作,为...
通过各种示例和项目,这本书可能引导读者掌握Clojure的核心概念,并了解如何将Clojure应用于实际的软件开发中。 至于Leiningen,它是Clojure社区广泛使用的构建自动化工具,由Alex Miller创建。Leiningen简化了...
在编程世界中,Clojure和Java是两种不同的编程语言,它们各具特色,但也有着紧密的联系。Clojure是一种基于Lisp的函数式编程语言,运行在Java虚拟机(JVM)上,因此它能够无缝地与Java代码交互。本实例将探讨如何在...
[2009] Programming Clojure.(Stuart Halloway).[1934356336].pdf [2010] Functional Programming with Clojure - Simple Concurrency on the JVM.(Tim Berglund, Matthew McCullough).[193650202X].pdf [2010] ...
在这个压缩包文件中,包含了一些关于Clojure的重要资源,特别是对于学习和理解Clojure 1.3.0版本非常有帮助。 1. **《Programming Clojure》**:这本书由Stuart Halloway和Aaron Bedra编写,是Clojure编程的经典...
列表(list)是Clojure中的基本数据结构,用于表示有序的元素集合。向量(vector)则是一种用于存储索引的集合。文档中的 `(range 4)` 生成了一个从0开始的序列,直到3。使用 `cons` 函数可以在列表前面添加元素,...
Lacinia是基于Clojure实现的一个GraphQL解析器,它为Clojure开发者提供了直接在Clojure环境中实现GraphQL服务的能力。 Lacinia的设计理念是保持与GraphQL规范的紧密一致性,同时充分利用Clojure的简洁性和强大的...