这里我的重点是Scala和Lisp/Scheme宏,不完全是C/C++/Obj-C中的宏.
我只是没有看到这一点.
我理解它的方式是,宏可以扩展语言.功能也是如此.
我知道有些东西由于某些语言限制而无法干净地实现,因此需要一种宏观方式.但是我用宏看到的很多例子似乎都是使用普通函数实现起来相当简单的事情.
那究竟是什么目的呢?清洁宏或其他,有人请赐教.如果可能的话,请提供一些可以在宏中完成的示例代码,但是对于普通函数来说是不可能/很难的.
有一个关于Scala宏已完成的事情的简明摘要:http://scalamacros.org/paperstalks/2014-02-04-WhatAreMacrosGoodFor.pdf.总而言之,已知宏有利于:1)代码生成,2)高级静态检查,3)授权特定于域的语言.让Scala中的宏基于类型为像Lisp类语言中的宏中常见的功能提供了额外的强大功能.
在上面链接的幻灯片一些例子确实没有宏来实现,但结果可能是在一定意义上缺乏(如性能)或为用户过于复杂(例如,由于权重股的错误消息).例如,Akka的类型化通道可以用纯粹的暗示实现,但编译速度和可理解性会受到影响.或者,scala/async可以作为编译器插件实现,但是它必须依赖于内部编译器API并且更难分发.
当然,宏不是银弹.当它们不是最佳选择时,显然存在用例,这是http://scalamacros.org/paperstalks/2014-03-01-MacrosVsTypes.pdf中概述的内容.然而,令人好奇的是,在许多情况下,无论是纯宏观还是无宏观解决方案,而是精心构造的混合动力车最终都是最好的.