写点什么

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:081921
用户头像

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

关注

评论

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

小岑的架构学习笔记-架构设计的历史背景

程序员小岑

k8s上运行我们的springboot服务之——热点数据

柠檬

redis

JVM源码分析之JVM启动流程

猿灯塔

科学理论的反思

美多丽可

学习

Spring注入的对象到底是什么类型

JFound

spring

k8s上运行我们的springboot服务之——简单的架构思考

柠檬

k8s springboot

程序员的晚餐 | 5 月 21 日 四季豆炒腊肠

清远

美食

两边夹的应用三

孙苏勇

算法 两边夹

极客时间学习心得:用分类和聚焦全面夯实技术认知

Anfernee Hu

学习

永中云转换新升级 文档在线预览增添更多选择

DT极客

怎么用"设计思维"思考产品?

Yanel 说敏捷产品

产品 设计 产品设计 产品开发

语雀性感,印象迟暮。

彭宏豪95

学习 工具 在线办公

乙己说:NUMA是个啥?

再见小飞侠

jdk G1 ZGC 内存

深入浅出SpringMVC系列~

程序员的时光

spring springmvc

传统岗位新挑战:信息安全之路

nexpose

安全架构师 安全 安全管理

c++代码整洁之道

泰伦卢

c c++ C#

Android | Tangram动态页面之路(六)数据分离

哈利迪

android

Golang testing: “no test files”

北纬32°

Go 语言

要弄清楚if/switch的本质区别,以及优化方式

张驰

Java

云上数据库类产品的模式与发展趋势

韩超

数据库 redis 腾讯云 阿里云

KubeSphere权威指南(一)--------使用KubeSphere创建Percona Server,并对外暴露端口

赵欣

k8s percona server

Python 如何随机打乱列表(List)排序

BigYoung

Python List random 随机

小岑的架构学习笔记-架构是什么?

程序员小岑

分布式数据库

Leiy

实战!我用 Wireshark 让你 “看得见“ TCP

小林coding

Linux TCP 计算机网络

我的事务为什么会失效

JFound

spring

健康饮食和定期运动带给我们的一点启示

董一凡

生活质量

乙己说:LRU实现思路整理

再见小飞侠

缓存 LeetCode Go 语言

[从零学习Spring Cloud]Nacos配置中心

玏佾

Spring Cloud nacos

高内聚与低耦合

落英亭郎

面向对象 高内聚 低耦合

数据产品经理实战-开篇

第519区

产品经理

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