写点什么

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

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

关注

评论

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

奇瑞汽车:降阶模型在新能源汽车热管理仿真上的应用

Altair RapidMiner

AI 汽车 仿真 altair AI 人工智能

C4D 动画设计工具Maxon Cinema 4D Studio S22 for mac

Mac相关知识分享

云行| 雪域高原“智变”数智高地,天翼云助力西藏开启发展新程!

天翼云开发者社区

云计算 云服务 天翼云

华为云开源项目Sermant正式成为CNCF官方项目

华为云开发者联盟

微服务 cncf #云原生 #开源 sermant

【论文速读】| RED QUEEN: 保护大语言模型免受隐蔽多轮越狱攻击

云起无垠

多线程在打包工具中的运用

不在线第一只蜗牛

UI 多线程

如何低成本实现 Prometheus 数据的长期存储?

Greptime 格睿科技

Prometheus 存储

Autodesk AutoCAD 2020 for mac(cad2020)激活版

Mac相关知识分享

运营TikTok需要什么网络环境

Ogcloud

云手机 海外云手机 tiktok云手机 tiktok运营 tiktok运营干货

简单几步,快速让你的 Java 项目拥有 AI 能力

豆包MarsCode

Python 程序员 AI

ElevenLabs X-to-Voice:社交账号自动生成能说话的个人页面;OpenAI 正式推出 ChatGPT 搜索

声网

python 爬虫如何爬取动态生成的网页内容

快乐非自愿限量之名

Python 爬虫

Databend 产品月报(2024年10月)

Databend

有Redis为什么还要本地缓存?谈谈你对本地缓存的理解?

王磊

DApp开发与DeFi、NFT交易平台及链游开发

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

专业的数据库工具DbVisualizer Pro for mac

Mac相关知识分享

Native Instruments Traktor Pro for mac数字DJ混音器软件

Mac相关知识分享

MacBook 触控板窗口管理软件Swish for Mac

Mac相关知识分享

VMware ESXi 8.0U3 xFusion (超聚变) 定制版更新 OEM BIOS 2.7 支持 Windows Server 2025

sysin

macos esxi OEM Xfusion

AI大模型高效开发神器来了 ,解读ModelArts 8大能力

华为云开发者联盟

modelarts 大模型 华为云Stack AI 人工智能

游戏显卡VS专业显卡:两者有什么区别?

Finovy Cloud

显卡

MEME币私募官方平台网站开发

区块链软件开发推广运营

交易所开发 链游开发 NFT开发 钱包开发 代币开发

Astute Graphics for Mac(全系列ai插件合集)

Mac相关知识分享

HarmonyOS 5.0应用开发——音频播放组件的封装

高心星

鸿蒙 HarmonyOS 鸿蒙5.0 HarmonyOS NEXT

Mac 电脑屏幕录制软件Replay Video Capture for mac

Mac相关知识分享

Coolmuster Android Assistant for Mac(Android管理工具)

Mac相关知识分享

数字先锋| 安全高效!天翼云电脑按下綦江数字政府建设“快进键”!

天翼云开发者社区

云计算 云服务

mac磁盘诊断和监测工具DriveDx for mac

Mac相关知识分享

如何在鲲鹏平台上快速上手应用开发?鲲鹏DevKit给你答案

华为云开发者联盟

性能调优 鲲鹏 鲲鹏DevKit

Js内建对象

EquatorCoco

JavaScript vue.js 前端

VMware Aria Automation 8.18 发布,新增功能概览

sysin

vmware automation aria

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