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 */