2008-10-21 20 views
3

假設我需要一些非常特殊的乘法運算符。它可以在下面的宏來實現:Nemerle宏的中綴格式

macro @<<!(op1, op2) 
{ 
    <[ ($op1 * $op2) ]> 
} 

我可以使用它像

def val = 2 <<! 3 

及其工作。

但我真正想要的是一些「爲DSL林正在開發english'般操作:

macro @multiply(op1, op2) 
{ 
    <[ ($op1 * $op2) ]> 
} 

,如果我嘗試使用它像

def val = 2 multiply 3 

編譯失敗」預期;'錯誤

什麼問題?我怎樣才能實現這種中綴格式宏?從編譯器源代碼

回答

7

直:

namespace Nemerle.English 
{ 
    [assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.English", "and", false, 160, 161)] 
    [assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.English", "or", false, 150, 151)] 
    [assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.English", "not", true, 181, 180)] 

    macro @and (e1, e2) { 
    <[ $e1 && $e2 ]> 
    } 

    macro @or (e1, e2) { 
    <[ $e1 || $e2 ]> 
    } 

    macro @not (e) { 
    <[ ! $e ]> 
    } 

你需要周圍灑OperatorAttributes,它會工作。順便說一句,OperatorAttribute定義如下:

public class OperatorAttribute : NemerleAttribute 
{ 
    public mutable env : string; 
    public mutable name : string; 
    public mutable IsUnary : bool; 
    public mutable left : int; 
    public mutable right : int; 
} 
1

由於通常,我發現答案早於comunity迴應:) 因此,解決方法是簡單地使用它指定宏作爲二進制運算符特殊assemply級屬性:

namespace TestMacroLib 
{ 
    [assembly: Nemerle.Internal.OperatorAttribute ("TestMacroLib", "multiply", false, 160, 161)] 
    public macro multiply(op1, op2) 
    { 
    <[ ($op1 * $op2) ]> 
    } 
} 
+0

擊敗我11秒。該死的:) – ADEpt 2008-10-21 21:51:06