写点什么

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

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

关注

评论

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

Atlassian应对CVE-2022-22963,CVE-2022-22965的常见问题

龙智—DevSecOps解决方案

Atlassian CVE-2022-22963 CVE-2022-22965

基于机器学习算法的钢材缺陷检测分类

Peter

Python 决策树 随机森林 集成学习 LightGBM

TypeScript基础学习

乌龟哥哥

4月月更

Android C++系列:C++最佳实践2抽象类

轻口味

c++ android 4月月更

TiDB 查询优化及调优系列(一)TiDB 优化器简介

PingCAP

seaborn绘制箱型图

Peter

可视化 数据可视化 seaborn

周日直播|OpenMLDB Pulsar Connector,高效打通实时数据到特征工程

Apache Pulsar

开源 架构 云原生 Apache Pulsar 消息中间件

低代码极简部署

源字节1号

低代码开发

企业如何进行信息化

秋去冬来春未远

数字化 信息化管理 如何信息化 信息化规律

面试突击39:synchronized底层是如何实现的?

王磊

Java java面试

云风:不加班、不炫技,把复杂的问题简单化

博文视点Broadview

Jira 云产品宕机多日,业界热议上云如何保障数据安全

万事ONES

Atlassian Jira 研发管理工具 项目管理工具 企业研发管理

react源码解析12.状态更新流程

buchila11

React

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

阿里巴巴云原生

Docker 实战教程之从入门到提高 (四)

汪子熙

Docker 容器 虚拟化 docker image 4月月更

从Opentracing、OpenCensus 到 OpenTelemetry,看可观测数据标准演进史

阿里巴巴云原生

大数据培训关于数据采集面试问题分享

@零度

数据采集 面试问题 大数据开发

Docker容器简介、优缺点与安装

乌龟哥哥

4月月更

如何在Unity中免费制作游戏

龙智—DevSecOps解决方案

Unity Perforce Helix Core

如何通过云效Codeup高效落地分支模式,提升开发协作率

阿里云云效

云计算 阿里云 版本管理 分支管理 分支模式

jupyter notebook换皮肤

Peter

Python 机器学习 数据分析 Jupyter Notebook

[Day14]-[动态规划]四键盘问题

方勇(gopher)

LeetCode 数据结构与算法、

半导体行业如何保持高效远程办公?因果集群(Causal Clustering)了解一下!

龙智—DevSecOps解决方案

远程办公 因果集群

react源码解析11.生命周期调用顺序

buchila11

React

自己动手写Docker系列 -- 5.8实现容器制定环境变量运行

Go Docker 4月月更

Linux驱动开发-编写W25Q64(Flash)驱动

DS小龙哥

4月月更

web前端培训学习需要掌握哪些 Linux 命令

@零度

前端开发

得物App H5秒开优化实战

得物技术

前端 H5 优化 实战 Web H5

基于卷积神经网络的猫狗识别

Peter

机器学习 深度学习 tensorflow keras

通过质量内建,提高交付质量

老张

软件测试 质量内建 交付质量

java培训:怎样才能写出一个优秀的对外接口

@零度

JAVA开发 对外接口

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