Nemerle 宏的中缀格式
假设我需要一些非常特殊的乘法运算符。 它可以在以下宏中实现:
macro @<<!(op1, op2)
{
<[ ( $op1 * $op2 ) ]>
}
我可以像使用它一样
def val = 2 <<! 3
和它的工作。
但我真正想要的是现在正在开发的 DSL 的一些类似于“英语”的运算符:
macro @multiply(op1, op2)
{
<[ ( $op1 * $op2 ) ]>
}
如果我尝试使用它,就像
def val = 2 multiply 3
编译器因“预期”而失败 一样 错误
问题是什么? 如何实现这个中缀格式的宏?
Say I need some very special multiplication operator. It may be implemented in following macro:
macro @<<!(op1, op2)
{
<[ ( $op1 * $op2 ) ]>
}
And I can use it like
def val = 2 <<! 3
And its work.
But what I really want is some 'english'-like operator for the DSL Im developing now:
macro @multiply(op1, op2)
{
<[ ( $op1 * $op2 ) ]>
}
and if I try to use it like
def val = 2 multiply 3
compiler fails with 'expected ;' error
What is the problem? How can I implement this infix-format macro?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
直接来自编译器源代码:
您需要散布 OperatorAttributes ,它就会起作用。 顺便说一句,OperatorAttribute 定义如下:
Straight from the compiler source code:
You need to sprinkle OperatorAttributes around and it will work. Btw, OperatorAttribute is defined as follows:
像往常一样,我比社区回复更早找到答案:)
因此,解决方案是简单地使用特殊的 assemply level 属性,将宏指定为二元运算符:
As usually, I found answer sooner than comunity respond :)
So, solution is to simply use special assemply level attribute which specifies the macro as binary operator: