Scala语言将加入宏指令

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

\u0026#xD;\n
\u0026#xD;\n

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

\u0026#xD;\n
\u0026#xD;\n

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

\u0026#xD;\n
\u0026#xD;\nimport scala.reflect.makro.Context\u0026#xD;\nimport language.experimental.macros\u0026#xD;\nobject Asserts {\u0026#xD;\n   def assert(cond: Boolean, msg: Any) = macro Asserts.assertImpl\u0026#xD;\n   def raise(msg: Any) = throw new AssertionError(msg)\u0026#xD;\n   def assertImpl(c: Context)(cond: c.Expr[Boolean], msg: c.Expr[Any]): c.Expr[Unit] =\u0026#xD;\n         if(assertionsEnabled) c.reify(if(!cond.splice) raise(msg.splice))\u0026#xD;\n          else c.reify(())\u0026#xD;\n}\u0026#xD;\n
\u0026#xD;\n

assert宏就像代码中的一个普通的方法。该实现使用macro方法委托成为编译器扩展。该编译器扩展是方法assertImpl。assertImpl使用当前编译的上下文作为参数,而参数传给assert作为语法树(Expr)。这些语法树接下来被用作产生一个新的语法树并被插入至assert宏方法被调用的位置。

\u0026#xD;\n

对于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\") 调用。

\u0026#xD;\n

reify和自清洁宏系统的更多细节可参考自清洁宏建议。

\u0026#xD;\n

有些人怀疑添加宏的效果,在一份题为《Scala Macros: \"Oh God Why?\"》博客中, Jay Kreps 评论道:

\u0026#xD;\n
\u0026#xD;\n

“这也是我对于Scala 宏指令的看法(Oh God Why?)。并不是因为宏指令或者这项提议有什么坏处,问题在于这真的是最重要的事情吗?”

\u0026#xD;\n
\u0026#xD;\n

Kreps接下来列举了一系列更重要的事情,包括编译速度、IDE支持、文档和编译文件大小。

\u0026#xD;\n

支持Kreps观点的大有人在。Ivan Todoroski在一封给Scala邮件列表的信中写到:

\u0026#xD;\n
\u0026#xD;\n

“在搜索问题的时候,Scala宏指令看起来只是一个低级别的、hacking风格的解决方案。它们在编写时太复杂,不太像Scala的风格,调试也麻烦,而且可能不过是为Scala的‘太多高深莫测的魔法’的形象增添了一笔。”

\u0026#xD;\n
\u0026#xD;\n

对此,Scala的发明者Martin Odersky回复说:

\u0026#xD;\n
\u0026#xD;\n

“宏的设计初衷和Scala语言的其他一般设计一样,都是为了使事情简单化。我们已经实现通过宏替换代码,希望其他功能也能这样实现。比如说,有一种强推在某种情况下消除 atomic { implicit transaction =\u0026gt; ... }中的隐含参数和许多其他相关情形。有了宏,这类问题就微不足道了。”

\u0026#xD;\n
\u0026#xD;\n

围绕着Scala宏的讨论已经逐渐偃旗息鼓,社区成员们正在等着看最终的实现。最终发布的版本始终没有放弃在宏指令方面的冒险。许多社区内基于宏的项目已经逐渐生根发芽,包括:

\u0026#xD;\n

Macrocosm——测试宏指令实际用例的库。

\u0026#xD;\n

Expecty——Groovy的Spock框架中的断言语句在Scala中的适应性改编。

\u0026#xD;\n

Slick——引进类似LINQ的数据库操作的尝试。Slick能转化Scala语法为数据库查询。

\u0026#xD;\n

ScalaMock——Scala的模拟对象测试库。

\u0026#xD;\n

在2.10.0-M4发布说明里可以找到其他一系列Scala2.10中的功能,包括:

\u0026#xD;\n

字符串插值

\u0026#xD;\n

Futures和Promises

\u0026#xD;\n

Value类

\u0026#xD;\n

动态类型

\u0026#xD;\n

隐式类

\u0026#xD;\n

Scala2.10版马上就要发布了,Scala开发团队号召人们试用最新的milestone发行版并提供反馈意见。你可以从这里下载最新版本。

\u0026#xD;\n

感谢杨赛对本文的审校。

\u0026#xD;\n

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

针对C++和Delphi的LiveBindings一瞥

绑定表达式(Binding expression)并不是新概念,XAML和Flex开发者主要就依靠这个。但除C/CX(只用于WinRT编程)之外,原生编程语言中通常见不到这种概念。不过为VCL和FireMonkey设计的LiveBindings却是个例外。…

图像处理的基础

图像处理的基础 图像作为人类感知世界的视觉基础,是人类获取信息、表达信息和传递信息的重要手段。 多数图像传感器的输出是连续的电压波形信号,这些波形的幅度和空间特性都与其所感知的光照有关。为了产生一幅数字图像,我们需要把连续的感知数据转换为数字形式,这个转换…

查询计算机端口号被谁占用了

"到底是谁占用了80端口,该怎么查,怎么终止它?",这里就简单讲解一下,在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等. 这里主要是用到windows下的DOS工具,点击"开始"--"运行",输入"cmd"后点击确定按钮,进入DOS窗口…

SPI分配传感器的寄存器

SPI分配传感器的寄存器 SPI分配寄存,来驱动传感器。或者将一些指令传出来给UART由PC端来控制。 信号名称方向位宽(bit)说明spi_com_clkI1spi通信模块时钟sys_rst_nI1系统复位,低电平有效wr_enI1写使能,主机给从机发送数据的使能信号,当wr_en为1时主机才能给从机发送数据…

OpenGL样板程序,会转动的正方形

一个OpenGL样板程序,环境为VS2010 // Test_OpenGL.cpp : 定义控制台应用程序的入口点。 ///** 1、OpenGL工具函数库(GLU),GLU函数实用glu前缀** 2、窗口系统,以支持OpenGL渲染,对于X窗口系统是GLX函数&…

Hadoop入门学习笔记——五、在虚拟机中部署Hive

视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 五、在虚拟机中部署Hive5.1. 在node1虚拟机安装MySQL5.2.…

ECC的代码实现

ECC的代码实现 数据校验介绍:  通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据是完整的。 如果是时序或者电路方…

FPGA图像处理的开发流程

FPGA图像处理的开发流程 1、需求分析及问题描述 问题描述应该清楚地描述问题而不是解决方法。它应该包括系统需要做什么、为什么要做,而不包括怎么做。 为了描述更具体,至少需要讨论三个方面。 第一是系统功能,也就是系统需要做什么。在一个图像处理应用中,需要详细说明图…

C/C++实现模糊控制,借助MATLAB辅助设计和fis.c文件

上一篇文章(C /C语言实现模糊控制)介绍了C/C中实现模糊控制该怎么做,开始提到的MATLAB模糊控制的C/C模糊控制接口fis.c库,不过这个文件有点老,在用VS2010编译的时候一大堆错误,在网上找关于C中使用 fis.c 的…

转载:Windows CE内存管理

内存管理如果你在写Windows CE 程序中遇到的最重要的问题,那一定是内存问题。一个WinCE 系统可能只有4MB 的RAM,这相对于个人电脑来说是十分少的,因为个人电脑的标准配置已经到了128MB 甚至更多。事实上,运行WinCE 的机器的内存十…

一些比较使用的技巧

一些比较使用的技巧 1、如何得到一个信号的上升沿 注意:时序逻辑有打一拍的特性,组合逻辑没有。 input vsync; reg vsync_r; reg vsync_r2; wire vsync_r2_n; wire vsync_rise;always@(posedge clk) beginvsync_r <= vsync;vsync_r2 <= vsync_r; endassign vsync_r2_…

2012年我读过的十本好书

1、《世上的光》是俄罗斯导演安德烈塔可夫斯基的拍立得摄影集。从中我们可以感受他在拍电影之余的个人生活&#xff0c;他的妻子&#xff0c;他的爱子以及梦幻般的乡村景色。而他配的文字更是让我们笃信他的确是个电影诗人。“影像&#xff0c;是真理的印记”“影像是谷粒&…

MFC界面编程新思路--模仿MATLAB式的界面

像下面的这个图片一样&#xff0c;做一个图像测量的软件&#xff0c;界面需要模仿MATLAB&#xff0c;以前老是新建一个对话框式的MFC应用程序&#xff0c;或者是一个SDI的应用程序&#xff0c;搞了一年&#xff0c;慢慢的也想到了一种新的思路&#xff0c;而且今天也做了一个De…

敏捷是如何使你跑得更快?

对于为何采用敏捷软件开发这个问题&#xff0c;企业经常提到的原因之一是希望能够更快地交付软件。研究表明敏捷项目能够进行地更快&#xff0c;例如《敏捷项目的成功证据》一文中描述的哥伦布市敏捷工作效率基准项目。\u0026#xD;\n在博文《谁说敏捷项目不能更快一些》中&#…

WinCE电源管理的简单介绍

电源管理的目的是节能,基本的节能方法是使系统适时的进出休眠状态.比如用户按下On/Off按钮,或者监视用户活动的定时器超时,或者应用呼叫api都可以使得系统休眠,用户再次按下On/Off或者其他唤醒中断将使得系统退出休眠.从而可见,电源管理模块和用户活动情况密不可分,电源管理是用…

算法映射技术

算法映射技术 将图像处理的算法转换为FPGA系统设计的过程为算法映射。 映射过程的首要目标便是确定系统设计的结构,在图像处理中常用的两种系统设计结构:流水线结构和并行阵列结构 1、流水线设计 (1)基本概念 流水线处理源自现代工业生产装配线上的流水作业,是指将待处理…

WS_EX_COMPOSITED是个BUG?

新建的SDI应用程序&#xff0c;在删除 文档视图结构以后&#xff0c;突然出现资源文件(*.rc)错误&#xff0c;说是WS_EX_COMPOSITED没有定义&#xff0c;只好删除了事&#xff0c;不知道怎么回事。

《北妹》:中国七零后作家的一次火山喷发(答记者问)

1&#xff0c;您是如何留意到盛可以及其创作的&#xff1f;是她在哪个方面的特质或者特点很突出呢&#xff1f; 答&#xff1a;我很早就知道盛可以&#xff0c;但是真正读她的作品是从《道德颂》开始的&#xff0c;当时我被她对人性尤其是男性的思考和揭示深深地震撼了。她对生…

windowsCE异常和中断服务程序初探

windowsCE异常和中断服务程序初探 ---------by nasiry 转载请说明出处 1。中断/异常相量的装入和执行方式。 中断和异常都是异步发生的事件&#xff0c;当该事件发生&#xff0c;系统将停止目前正在执行的代码转而执行事件响应的服务程序。而事件服务程序的入口点就…

ISERDES Guidelines

ISERDES Guidelines ISERDES模块的作用在于实现高速源同步输入数据的串并转换。 OSERDES模块的作用在于实现高速源同步输出数据的并串转换。 SERDES支持SDR和DDR两个模式。 SDR模式支持2、3、4、5、6、7、8bit位宽; DDR模式支持4、6、8bit位宽,10或14bit位宽需要两个模块级…