質問
非常に特別な乗算演算子が必要だとしましょう。次のマクロで実装できます:
macro @<<!(op1, op2)
{
<[ ( $op1 * $op2 ) ]>
}
そして次のように使用できます
def val = 2 <<! 3
そしてその仕事。
しかし、私が本当に欲しいのは、現在開発中のDSL Imの「英語」のような演算子です:
macro @multiply(op1, op2)
{
<[ ( $op1 * $op2 ) ]>
}
そして次のように使用しようとすると
def val = 2 multiply 3
コンパイラは 'expected;'で失敗しますエラー
問題は何ですか?この中置形式マクロを実装するにはどうすればよいですか?
解決
コンパイラのソースコードからの直線:
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;
}
他のヒント
いつものように、コミュニティが応答するよりも早く答えを見つけました:) したがって、解決策は、マクロをバイナリ演算子として指定する特別なアセンブリレベル属性を使用することです。
namespace TestMacroLib
{
[assembly: Nemerle.Internal.OperatorAttribute ("TestMacroLib", "multiply", false, 160, 161)]
public macro multiply(op1, op2)
{
<[ ( $op1 * $op2 ) ]>
}
}
所属していません StackOverflow