Topic: Scala语言将加入宏指令

  Print this page

1.Scala语言将加入宏指令 Copy to clipboard
Posted by: 阿熊
Posted on: 2013-01-28 11:32

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和自清洁宏系统的更多细节可参考自清洁宏建议


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923