写点什么

Clojure 1.7 引入 Transducers,提高跨平台支持度

  • 2015-08-05
  • 本文字数:861 字

    阅读完需:约 3 分钟

Cognitect 的 Alex Miller:Transducers 和reader conditionals 是Clojure 1.7 最重要的两个特性。 Transducers 的目标是使不同的集合可组合算法转换, 而 reader conditionals 可以用来改善 Clojure 跨 JVM 和 JavaScript 平台的可移植性。

Transducers

Transducers 是一种减量函数转换器(reducing function transformers),获取一种减量函数并返回另一种的函数。减量函数仅仅是一种可以用来 reduce 的函数。Rich Hickey解释说: transducers 的主要优势是它们允许分离三个主要问题:

  • 减量函数是什么;
  • 应用在哪些集合中;
  • reduce 的输入。

在 Clojure 1.7 中,为了支持 Transducers,像 map、cat、filter 等大多数序列函数,在输入集合中都添加了一个新的参数。例如,

(def tr1 (map f))将会返回一个 map transducer。此外,Transducers 可以通过 Comp 函数组合:

(def xform (comp (filter odd?)(map inc)))来提供一个新的 Transducers。一旦你有了一个 Transducers,你可以把它应用在几个方面,例如矢量数据。

(Sequence Xform data)使用 Transducers 函数替代 sequence,你将会获得跟将 reduce 应用在 data 上同样的结果并获得组合函数原型。

上面示例的主要好处是:如果使用简单的组合功能,当它运行时,仅仅建立一个 lazy sequence 而不是三个。

Reader conditionals

Reader conditionals 是 Clojure 1.7 引入的一种新的格式,可以由 Clojure 和 ClojureScript 加载,并可以应用在.cljc 文件语境中。把多个 Clojure 平台使用一种代码库作为目标的方法,使得拥有库和应用程序成为可能,并且 Reader conditionals 提供的机制让处理平台特定代码时更加容易。

类似于 cond 形式,Reader conditionals 表达式允许为每一个平台指定应该使用的平台特定代码。例如下面的表达式:

[1 2 #?@(:clj [3 4] :cljs [5 6])]在 Clojure 上我们将会得到 [1 2 3 4],在 ClojureScript 上是 [1 2 5 6]。

Clojure 1.7 除了 Transducers 和 Reader conditionals,还包含了更多新的特性和增强功能。

查看英文原文 Clojure 1.7 Introduces Transducers, Improves Cross-platform Support

2015-08-05 07:081844
用户头像

发布了 92 篇内容, 共 24.8 次阅读, 收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

一文带你彻底厘清 Kubernetes 中的证书工作机制

首富手记

Kubernetes

实用贴丨正确的「递归」打开方式:让计算机像计算机一样去计算

博文视点Broadview

Python 递归

[Git] Git 可以这么学

猴哥一一 cium

git

有价值的产品=设计思维+精益创业+敏捷方法

老彦

Scrum 敏捷开发 Agile 设计思维 精益创业

ARTS - Week One

shepherd

js algorithm

五个“为什么” —— 读《精益创业》

YoungZY

读书笔记

学计算机你后悔了吗?

陈辰

学习 技术 大前端

[GitHub] 跟我一起白嫖 GitHub Pages 做个人站点 ?

猴哥一一 cium

git GitHub GitHub Pages

翻译敏捷行业专业外文,不只是谷歌翻译

老彦

翻译 Scrum 敏捷开发 Agile

李想解读《高效能人士的七个习惯》

我心依然

习惯 高效能人士的七个习惯 李想 汽车之家

python实现·十大排序算法之希尔排序(Shell Sort)

南风以南

Python 排序算法 希尔排序

Flutter的staggered GridView详细使用

潘珉

flutter

游戏夜读 | 如何避免乏味?两则

game1night

「开放」对协作效率的影响

Tony Wu

产品 产品设计

2020年2月北京BGP机房网络质量评测报告

博睿数据

APM 机房 评测 世纪互联

孩子,我们在睡前一起来阅读 15 分钟的好书,让彼此都带着好的故事入眠。

叶小鍵

正确阅读 托马斯·奥本 Doug Antin 蒂·泰德罗克

有点干货 | Jdk1.8新特性实战篇(41个案例)

小傅哥

函数式接口 Lambda 小傅哥 jdk8 编码

2020年2月北京BGP机房网络质量评测报告

博睿数据

工厂模式 (一)简单的工厂模式概念以及示例代码

LSJ

Kubectl exec 的工作原理解读

米开朗基杨

Kubernetes kubelet

关于问题的问题 —— 读《你的灯亮着吗?》

YoungZY

读书笔记 读书

数仓系列 | Flink 窗口的应用与实现

Apache Flink

大数据 flink 流计算 实时计算

Golang热更新原理

我心依然

nginx Linux 信号 Go 语言

给学妹的 Java 学习路线

武培轩

Java 学习 程序员 程序媛

Zabbix实战指南

橙子冰

技术 运维 监控 运维自动化 zabbix

Lean UX 教你设计如何驱动产品

Yanel 说敏捷产品

产品 敏捷 设计

Elasticsearch 实战

代码诗人

软件开发生产率改进之我见(一)

清水

团队管理 软件工程 技术管理

面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

苹果看辽宁体育

mybatis

内容比形式更重要

Winann

内容 生活 工作 形式主义

基于mysqldump聊一聊MySQL的备份和恢复

麦洛

MySQL

Clojure 1.7引入Transducers,提高跨平台支持度_后端_Sergio De Simone_InfoQ精选文章