scala 宏

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

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

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

  1. import scala.reflect.makro.Context
  2. import language.experimental.macros
  3. object Asserts {
  4. def assert(cond: Boolean, msg: Any) = macro Asserts.assertImpl
  5. def raise(msg: Any) = throw new AssertionError(msg)
  6. def assertImpl(c: Context)(cond: c.Expr[Boolean], msg: c.Expr[Any]): c.Expr[Unit] =
  7. if(assertionsEnabled) c.reify(if(!cond.splice) raise(msg.splice))
  8. else c.reify(())
  9. }

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发行版并提供反馈意见。你可以从这里下载最新版本

时间: 2024-11-05 15:43:28

scala 宏的相关文章

一篇入门 — Scala 宏

前情回顾 上一节, 我简单的说了一下反射的基本概念以及运行时反射的用法, 同时简单的介绍了一下编译原理知识, 其中我感觉最为绕的地方, 就属泛型的几种使用方式了. 而最抽象的概念, 就是对于符号和抽象树的这两个概念的理解. 现在回顾一下泛型的几种进阶用法: 上界 <: 下界 >: 视界 <% 边界 : 协变 +T 逆变 -T 现在想想, 既然已经有了泛型了, 还要这几个功能干嘛呢? 其实可以类比一下, 之前没有泛型, 而为什么引入泛型呢? 当然是为了代码更好的服用. 想象一下, 本来一个

Scala 中的异步事件处理

在任何并发性应用程序中,异步事件处理都至关重要.无论事件的来源是什么(不同的计算任务.I/O 操作或与外部系统的交互),您的代码都必须跟踪事件,协调为响应它们而执行的操作.应用程序可以采用两种基本方法之一来实现异步事件处理: 阻塞:一个等待事件的协调线程. 非阻塞:事件向应用程序生成某种形式的通知,而没有线程显式等待它. 合成事件 scala.concurrent.Promise 和 scala.concurrent.Future 类为 Scala 开发人员提供了一些与 Java 8 开发人员的

Scala语言初识

scala是一种集面向对象特性和函数式特性于一身并可运行在JVM上的强类型静态语言.因为可以运行在JVM上,并在设计时借鉴于大量的java语言特性,故可以和java互动并可以调用java相关类库,这让现在大量掌握java的编程者的智力投资得到极大的利用.并且还借鉴了Elang函数语言及Ruby等脚本语言,从而有高效,轻便等特性,从而原来掌握Ruby,Erlang等语言者,来学习scala时感到亲切从而更加快捷掌握. scala由洛桑联邦理工学院的Martin Odersky设计,第一个版本发布于

为什么选择Scala,它在大数据处理方面有何优势?

近年来,关于大数据讨论已然是热火朝天,虽不说是家喻户晓,那至少对于业界来说也是引起了轩然大波.作为学生党的我,最近也在研究关于大数据的东东.作为一个技术迷,总是会想尝试一些新鲜的东西.前一段时间学习了Hadoop之后,又想看看Spark是什么东东.那么在这里有必要八卦一下Spark了. Spark是发源于美国加州大学伯克利分校AMPLab的集群计算平台.它立足于内存计算,从多迭代批量处理出发,兼收并蓄数据仓库.流处理和图计算等多种计算范式,是罕见的全能选手.就大数据集而言,对典型的迭代机器 学习

scala macro-使case copy易读

ps:好久没写blog了,1是没时间写,2也是没啥干货.最近终于积累了些东西,可以拿出来晒晒.哈哈. 先说需求吧,boss让我将case class copy 的代码简化,使之易读. case class A(a:String,b:Int) case class B(a:A,b:Int,c:String) val b = B(A("a",2),3,"c") b.copy(a.copy(b=2)) //上面是简单的例子,如果case class 多重嵌套时,就会产生类

Chisel3 - Scala语言专家

https://mp.weixin.qq.com/s/j8mt_qvwliKIKtlN6JcyqQ 介绍Intellij IDEA安装Scala插件后,如何在阅读和编码两方面助益开发者. 1. 语言专家 Scala是一门多范式编程语言,在支持面向对象编程的同时,也支持函数式语法.再加上隐式规则和宏等特性,以及众多的语法糖.使得Scala的学习曲线异常陡峭. 除了语言规范.教程图书.网络资料之外,一个强大的能够智能提示补全.时时检查提醒的编辑器或者IDE,可以极大的提高学习速度和编码效率. 事实上

宏定义中的#,##,...,do{}while(0),__VA_ARGS__

宏定义中的#,## 1.在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组 #define syslog(a) fprintf(stderr,"Warning: " #a"\n"); 2.简单的说,"## "是一种分隔连接方式,它的作用是先分隔,然后进行强制连接 举列 -- 试比较下述几个宏定义的区别 #define A1(name, type)  type name_##type##_type 或 #define A

Scala Study --- override

以前没使用过Scala, 其实我Java也是半截水平\无奈, 学Java的时候刚从C++中挣脱出来,发现Java无比优雅,但很快又对Java种种不信任程序员的设计感到受限. 直到, , 今天遇到了Scala\撒花 Scala的collection设计不能更赞!一段时间后打算专门写篇文章总结Scala,名字就叫"我为什么喜欢Scala!". 废话就不多说了,今天研究了一下Scala的override用法与特点. override --- one of the key words of S

Word中 简单宏的使用

 (注意:打开文档时按住 Shift 键可以阻止 AutoOpen 宏运行) 1:Word中能够自动运行的默认宏代码名称及触发条件如下 -------------------------------------------------------- 1.名称:AutoExec 条件:启动Word或加载全局模板 2.名称:AutoNew 条件:每次生成新文档时 3.名称:AutoOpen 条件:每次打开一个已有文档时 4.名称:AutoClose 条件:每次关闭文档时 5.名称:AutoExit