2008-10-21 7 views
3

Dites que j'ai besoin d'un opérateur de multiplication très spécial. Il peut être mis en œuvre en macro suivante:Format infixe pour la macro Nemerle

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

Et je peux l'utiliser comme

def val = 2 <<! 3 

et son travail.

Mais ce que je veux vraiment est un peu « opérateur english' comme pour le DSL Im développe actuellement:

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

et si je tente de l'utiliser comme

def val = 2 multiply 3 

compilateur échoue avec » attendu erreur

Quel est le problème? Comment puis-je implémenter cette macro au format infix?

Répondre

7

droite à partir du code source du compilateur:

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 ]> 
    } 

Vous devez saupoudrer OperatorAttributes autour et il fonctionnera. BTW, OperatorAttribute est défini comme suit:

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

Comme d'habitude, je trouve répondre plus tôt que comunauté répondre :) Donc, la solution est d'utiliser simplement attribut de niveau assemply spécial qui spécifie la macro comme opérateur binaire:

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

Battez-moi de 11 secondes. Merde :) – ADEpt

+1

Cela peut aussi signifier que vous devriez parcourir un peu plus avant de demander des choses. –

+0

Vous pouvez également envoyer votre question à Google Groupes: https://groups.google.com/forum/#!forum/nemerle-fr –

Questions connexes