AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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

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

关注

评论

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

使用YMP工具实现Oracle到YashanDB迁移全过程解析

数据库砖家

数据库

Oracle 迁移 YashanDB 的顺滑实战体验:一条龙的工具到底有多省心?

数据库砖家

数据库·

级联vs端到端、全双工、轮次检测、方言语种、商业模式…语音 AI 开发者都在关心什么?丨Voice Agent 学习笔记

声网

2025年最新猫头虎简介:猫头虎技术团队

猫头虎

外贸企业网络加速方案选择指南

Ogcloud

网络加速 企业组网 海外网络加速 企业网络加速 网络加速服务

Electron Demo 的快速编译与启动

Geek_1ef48b

Wasm Client SDK线上优化

Geek_1ef48b

YashanDB|update/delete 没有命中数据,alter 却卡死?其实是 TS 锁在作怪

数据库砖家

数据库·

Google创始人:未来一年绝大多数程序员将被AI取代;FeedbackStream:8分钟创建语音访谈智能体,输出高质量洞察

声网

LangChain案例实战:顺序链、分支链、循环链

AI时代的一滴水

Python AI agent #LangChain

YashanDB|修改yac参数后执行shutdown immediate数据库卡住的原因和解决办法

数据库砖家

数据库

为什么YashanDB共享集群的高可用能力被频繁点赞?核心机制到底强在哪?

数据库砖家

数据库

YashanDB知识库|执行 shutdown immediate 无响应还导致 coredump?背后原因找到了!

数据库砖家

为什么 .NET8线程池 容易引发线程饥饿

量贩潮汐·WholesaleTide

Java .net

Arthas stack (输出当前方法被调用的调用路径)

刘大猫

Java 监控 Arthas stack 调用路径

Flutter Demo 的快速编译与运行

Geek_1ef48b

云图说|HSS新版‘反黑三件套’,全方位守护主机与容器安全!

华为云开发者联盟

华为云 主机安全 HSS

面试5家收到4家offer,Java面试成功率高达80%!

程序员高级码农

Java java面试 Java面试题 Java面试题库

ATEN宏正现身InfoComm China 2025,智算中枢赋予运维新可能

编程猫

vllm+vllm-ascend本地部署QwQ-32B

zjun

YashanDB知识库|使用EXP导出全库导致服务器卡死?可能是这个原因!

数据库砖家

数据库·

Oracle迁移YashanDB实录:初试YMP异构数据库迁移平台

数据库砖家

数据库·

Easysearch Rollup 相比 OpenSearch Rollup 的优势分析

极限实验室

Rollup Performance easysearch OpenSearch

无界闪联 鸿启未来|“源师兄”智慧大脑L1焕新升级发布

坚果

润开鸿

《Operating System Concepts》阅读笔记:p749-p763

codists

操作系统

SvelteKit 最新中文文档教程(22)—— 最佳实践之无障碍与 SEO

冴羽

前端开发 前端框架 React Svelte SvelteKit

深入研究:亚马逊商品列表API详解

tbapi

亚马逊API 亚马逊商品详情API 亚马逊商品列表接口 亚马逊数据采集

覆盖 6 大场景的在线工具网!这个宝藏网站让学习、办公、带娃全变简单

极客天地

YashanDB知识库|SQL语句报 YAS-00103 是因为忘了 close?

数据库砖家

数据库·

Wasm Client SDK 架构介绍

Geek_1ef48b

YashanDB知识库|SQL 中用了 OR,怎么反而性能下降了?该不该改写?

数据库砖家

数据库

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