写点什么

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

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

关注

评论

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

10年阿里开发架构师经验分享:享学课堂架构师vip百度云

android 程序员 移动开发

1307页阿里Android面试全套真题解析在互联网火了,附赠复习资料

android 移动开发

12道Android高级面试题:android开发视频百度网盘

android 程序员 移动开发

12道Android高级面试题:android项目开发实战入门百度网盘

android 程序员 移动开发

华为财经2021春招面试,尚硅谷springboot笔记,最全Java知识总结

Java 程序员 后端

厉害了!尚硅谷mysql中employees表,腾讯T2手把手教你

Java 程序员 后端

QCon复盘之《58 集团反爬系统建设之路》

IT蜗壳-Tango

Qcon 10月月更

原来SqlSession只是个甩手掌柜,Redis有几种数据类型

Java 程序员 后端

只需一篇文章吃透Java多线程技术,内容非常全面

Java 程序员 后端

【免费报名】与阿里云一同探索视频云的新技术与新场景

阿里云CloudImagine

阿里云 音视频 视频编码 视频编解码 视频云

声纹识别帮你守住钱袋子,聊一聊证券行业里的人工智能

Zilliz

AI 向量检索 Milvus 向量

卧薪尝胆70天内推入职阿里,2021Java春招

Java 程序员 后端

厉害了!java使用教程视频,我的Java春季历程

Java 程序员 后端

反向代理、负载均衡实战,【深度思考

Java 程序员 后端

史上最全的Java面试题集锦,高级Java工程师面试技术

Java 程序员 后端

2020-2021华为Android面试真题,凭借这份Android面试题集

android 程序员 移动开发

我有一台服务器,能干啥?

程序员鱼皮

程序员 IT 代码 计算机 java

2019-2021历年华为跳动Android面试真题解析,面经解析

android 程序员 移动开发

只需一篇文章吃透Java多线程技术,那些BAT大厂的Java面试官到底在想些什么

Java 程序员 后端

DevOps 时代的高效测试之路

CODING DevOps

DevOps 团队 自动化测试 持续交付

人力资源管理系统和oa的区别?

优秀

低代码

1-3年Android开发工程师面试经验分享,真的太香了

android 程序员 移动开发

100%好评,扔物线学堂

android 程序员 移动开发

15分钟的字节跳动视频面试,34岁Android程序员裸辞

android 程序员 移动开发

只用了几百行代码写的百度搜索引擎,程序员Javaweb源码

Java 程序员 后端

使用 Spring Boot 进行单元测试

码界行者

Java Spring Boot Unit Test

大数据Flink作业

Clarke

1个月学会Android开发!动脑学院vip

android 程序员 移动开发

厉害了,java入门电子书百度网盘下载,Java中高级面试

Java 程序员 后端

河北联通全光智慧专线,构筑更智运营新体验

10天用Flutter撸了个高仿携程App,2021年Android面试心得

android 程序员 移动开发

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