NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

Scala 语言将加入宏指令

  • 2013-01-22
  • 本文字数:1580 字

    阅读完需:约 5 分钟

Scala 开发团队正在将实验版宏指令加入到即将发行的 2.10 版中。Scala 宏指令提供了编译时元编程的高级形式。 Scala 宏网站描述道:

“宏指令显著简化了代码分析和代码生成,这使得它们成为处理大量现实用例的一种可选工具。传统上涉及编写和维护样板的场合可用宏以简单且易维护的方式实现。因此我们认为宏对于 Scala 编程语言是一项非常有价值的资产。”

Scala 的宏指令允许开发者创建方法时以语法树转化的形式实现。这些是标准方法的定义,其在编译期间被显式地转换。举一个简单的例子,如 assert 方法:

复制代码
import scala.reflect.makro.Context
import language.experimental.macros
object Asserts {
def assert(cond: Boolean, msg: Any) = macro Asserts.assertImpl
def raise(msg: Any) = throw new AssertionError(msg)
def assertImpl(c: Context)(cond: c.Expr[Boolean], msg: c.Expr[Any]): c.Expr[Unit] =
if(assertionsEnabled) c.reify(if(!cond.splice) raise(msg.splice))
else c.reify(())
}

assert 宏就像代码中的一个普通的方法。该实现使用 macro 方法委托成为编译器扩展。该编译器扩展是方法 assertImpl。assertImpl 使用当前编译的上下文作为参数,而参数传给 assert 作为语法树(Expr)。这些语法树接下来被用作产生一个新的语法树并被插入至 assert 宏方法被调用的位置。

对于 assert 宏来说,调用 assert 的方法 assert(x != null, “X is null”) 会给 cond 变量填充 x != null 的语法树而给 msg 变量填充"X is null"的语法树。对 reify 的调用会产生一个 if(x != null) Asserts.raise(“X is null”) 的或者 () 的新语法树。这个语法树会替代原始的 assert(x != null, “X is null”) 调用。

reify 和自清洁宏系统的更多细节可参考自清洁宏建议

有些人怀疑添加宏的效果,在一份题为《 Scala Macros: “Oh God Why?”》博客中, Jay Kreps 评论道:

“这也是我对于 Scala 宏指令的看法(Oh God Why?)。并不是因为宏指令或者这项提议有什么坏处,问题在于这真的是最重要的事情吗?”

Kreps 接下来列举了一系列更重要的事情,包括编译速度、IDE 支持、文档和编译文件大小。

支持 Kreps 观点的大有人在。Ivan Todoroski 在一封给 Scala 邮件列表的信中写到:

“在搜索问题的时候,Scala 宏指令看起来只是一个低级别的、hacking 风格的解决方案。它们在编写时太复杂,不太像 Scala 的风格,调试也麻烦,而且可能不过是为 Scala 的‘太多高深莫测的魔法’的形象增添了一笔。”

对此,Scala 的发明者 Martin Odersky 回复说:

“宏的设计初衷和 Scala 语言的其他一般设计一样,都是为了使事情简单化。我们已经实现通过宏替换代码,希望其他功能也能这样实现。比如说,有一种强推在某种情况下消除 atomic { implicit transaction => … }中的隐含参数和许多其他相关情形。有了宏,这类问题就微不足道了。”

围绕着 Scala 宏的讨论已经逐渐偃旗息鼓,社区成员们正在等着看最终的实现。最终发布的版本始终没有放弃在宏指令方面的冒险。许多社区内基于宏的项目已经逐渐生根发芽,包括:

Macrocosm ——测试宏指令实际用例的库。

Expecty ——Groovy 的 Spock 框架中的断言语句在 Scala 中的适应性改编。

Slick ——引进类似 LINQ 的数据库操作的尝试。Slick 能转化 Scala 语法为数据库查询。

ScalaMock ——Scala 的模拟对象测试库。

2.10.0-M4 发布说明里可以找到其他一系列 Scala2.10 中的功能,包括:

字符串插值

Futures 和 Promises

Value 类

动态类型

隐式类

Scala2.10 版马上就要发布了,Scala 开发团队号召人们试用最新的 milestone 发行版并提供反馈意见。你可以从这里下载最新版本


感谢杨赛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2013-01-22 03:532828
用户头像

发布了 21 篇内容, 共 64614 次阅读, 收获喜欢 1 次。

关注

评论

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

项目经理如何有效管理项目进度?项目管理3大常见问题及解决方案

优秀

项目管理 项目管理工具

低代码平台对程序员有哪些好处?

J2PaaS低代码平台

基于STM32设计的校园一卡通项目

DS小龙哥

C语言 嵌入式 单片机

安全架构要参:构建企业适用的安全架构

I

安全架构 企业安全

MongoDB高级应用之数据转存与恢复(5)

Tom弹架构

Java 分布式数据库mongodb

谁说操作系统没有创新,这里就有一个,还是分布式的

LAXCUS分布式操作系统

QCon-OPPO大规模CV预训模型技术及实践

安第斯智能云

算法 计算机视觉 预训练模型

如何修改Kestrel上传文件的大小

喵叔

1月月更

洞态漏洞检出测试第二期:NoSQL & LDAP注入漏洞

火线安全

DevSecOps WEB安全 安全漏洞

涨薪密码 | 音视频开发-程序员界的技术皇冠

Yt

音视频 WebRTC ffmpeg 流媒体 SRS流媒体服务器

政法委重点人员联防联控系统开发,重点人群管理服务平台建设

a13823115807

全新UI西游H5决战天宫游戏详细图文架设教程

echeverra

关于熟经济和通胀--《香帅中国财富报告》摘录(2/100)

hackstoic

经济

看了个女装项目(doge

你?

Java 中 Jackson 的 readTree

HoneyMoose

基于STM32设计的指针式电子钟与日历

DS小龙哥

C语言 嵌入式 单片机

为什么企业组织更愿意选择内部私有的IM,而不使用钉钉、微信等软件?

WorkPlus

跨越2021丨在逐梦中星夜兼程,在前行中不忘初心

YonBuilder低代码开发平台

低代码

如何用建木CI部署k8s资源

Jianmu

Kubernetes DevOps CI/CD 开源项目

CVE-2021-32682 elFinder RCE 简单分析

H

网络安全 安全漏洞

CRM系统的六大优势

低代码小观

低代码 CRM 客户关系管理 CRM系统 客户关系管理系统

云智慧运维管理平台OMP荣获OSC中国开源项目评选「最受欢迎项目」奖

云智慧AIOps社区

开源项目 运维工程师 运维监控 自动化运维 运维管理

年度盘点丨2021数字化转型优秀案例TOP10

ToB行业头条

阿里云「低代码音视频工厂」正式上线,为企业用户打造音视频应用开发最短路径

阿里云视频云

音视频 低代码 开发

基于STM32设计的健康检测设备(测温心率计步)

DS小龙哥

C语言 嵌入式 单片机

基于STM32设计的数字电子秤

DS小龙哥

C语言 嵌入式 单片机

采购堡垒机时候,选择开源堡垒机还是云堡垒机?

行云管家

云计算 网络安全 等保 堡垒机

低代码实现探索(十二)vue.config.js模块打包

零道云-混合式低代码平台

Mithril.js:一个高性能 JavaScript MVC 框架

devpoint

typescript mvc 1月月更 Mithril.js

基于STM32设计的计算器(实现基本运算)

DS小龙哥

C语言 嵌入式 单片机

2022年石家庄等保测评公司名单(排名部分先后)

行云管家

网络安全 等保 等保测评 石家庄

Scala语言将加入宏指令_Scala_Josh Suereth_InfoQ精选文章