Lambda expressions

C#3.0のLambdaがシンプルで良い感じなので、Nemerleでも真似出来ないかと色々試すも、私の知識じゃ歯が立たず。あんまマクロ分かってないんですよね。(^^;

で、格闘の跡。

using Nemerle.Compiler;

// 引数1つ
macro @fx (parm : parameter, body)
    syntax ("fx", parm, "->", body)
{
    match (parm) {
        | <[ parameter: $(iname : name) : $ty ]> =>
          <[ fun ($ (iname : name) : $ty) { $body } ]>
        | _ => Message.FatalError ("excepted a single parameter")
    }
}

// 引数2つ
macro @fy (parm1 : parameter, parm2 : parameter, body)
    syntax ("fy", parm1, parm2, "->", body)
{
    match (parm1) {
        | <[ parameter: $(iname1 : name) : $ty1 ]> =>
            match (parm2) {
                | <[ parameter: $(iname2 : name) : $ty2]> => 
                    <[ fun ($ (iname1 : name) : $ty1, $ (iname2 : name) : $ty2) { $body } ]>
                | _ => Message.FatalError ("excepted two parameters");
            }
        | _ => Message.FatalError ("excepted two parameters")
    }
}

使い方は、こんな感じ。

def f1 = fx x -> x * 2;
def f2 = fy x y -> x + y * 2;
def f3 = fy a b -> a * 2 + b;
Nemerle.IO.printf("%d\n", f1 (10));
Nemerle.IO.printf("%d\n", f2 (10, 20));
Nemerle.IO.printf("%d\n", f3 (10, 20));

/* 結果
20
50
40
 */