[svn] r6141: nemerle/trunk/ncc: parsing/MainParser.n
testsuite/positive/macrolib.n testsuite/positive/macr...
nazgul
svnadmin at nemerle.org
Tue Feb 28 22:40:45 CET 2006
Log:
Allow ellipsis for specifing list of members in defined class (#631)
Author: nazgul
Date: Tue Feb 28 22:40:41 2006
New Revision: 6141
Modified:
nemerle/trunk/ncc/parsing/MainParser.n
nemerle/trunk/ncc/testsuite/positive/macrolib.n
nemerle/trunk/ncc/testsuite/positive/macroprog.n
nemerle/trunk/ncc/typing/Macros.n
Modified: nemerle/trunk/ncc/parsing/MainParser.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser.n (original)
+++ nemerle/trunk/ncc/parsing/MainParser.n Tue Feb 28 22:40:41 2006
@@ -571,9 +571,18 @@
unless (key == "type")
match (get_token ()) {
| Token.BracesGroup (children) =>
+ push_stream (children);
+ match (maybe_parse_ellipsis ()) {
+ | Some(e) =>
+ pop_stream ();
+ members = [ClassMember.Field (e.loc, null, null, e)]; // special encoding for <[ decl: class A { ..$mems } ]>
+
+ | _ =>
+ pop_stream ();
when (key == "variant") in_variant = true;
members = process_groups (children, "type member", ParseClassMember);
- in_variant = false;
+ in_variant = false
+ }
| x => Error (x, "expecting type body");
}
Modified: nemerle/trunk/ncc/testsuite/positive/macrolib.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/macrolib.n (original)
+++ nemerle/trunk/ncc/testsuite/positive/macrolib.n Tue Feb 28 22:40:41 2006
@@ -323,3 +323,24 @@
}
}
+
+macro metaclass(className, body)
+syntax ("metaclass", className, body)
+{
+ def ctx = Nemerle.Macros.ImplicitCTX();
+ mutable code = [];
+ match ((className, body)) {
+ | (<[ $(nm : name) ]>, <[ { .. $props } ]>) =>
+ foreach(<[ $(n : name) : $(t : name) ]> in props) {
+ code ::= <[ decl:
+ [Nemerle.Utility.Accessor]
+ mutable $(n.NewName("_" + n.Id) : name) : $(t : name) ;
+ ]>;
+ }
+ def builder = ctx.Env.Define(<[ decl: [Record] public class $(nm : name) { .. $(code.Reverse()) } ]>);
+ builder.Compile();
+
+ | _ => Message.FatalError($"Invalid metaclass syntax, expected properties definition, got $body");
+ }
+ <[ () ]>
+}
Modified: nemerle/trunk/ncc/testsuite/positive/macroprog.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/macroprog.n (original)
+++ nemerle/trunk/ncc/testsuite/positive/macroprog.n Tue Feb 28 22:40:41 2006
@@ -62,6 +62,10 @@
assert (foo1 (1) == "TADA");
LogTest.Go ();
+
+ metaclass inline_meta { x : int; y : string };
+ assert (inline_meta (1, "").X == 1);
+ assert (inline_meta (2, "a").Y == "a");
}
}
Modified: nemerle/trunk/ncc/typing/Macros.n
==============================================================================
--- nemerle/trunk/ncc/typing/Macros.n (original)
+++ nemerle/trunk/ncc/typing/Macros.n Tue Feb 28 22:40:41 2006
@@ -366,6 +366,12 @@
}
}
+ private lift_members (members : list [ClassMember]) : PExpr
+ {
+ | [Field (Ellipsis (e)) as f] when f.name == null && f.modifiers == null => quoted_expr (e)
+ | _ => Lift (members, quoted_member);
+ }
+
internal quoted_tydecl (td : TopDeclaration) : PExpr {
def qn = quoted_sstring (td.name);
def qattr = quoted_attributes (td.modifiers);
@@ -374,7 +380,7 @@
| TopDeclaration.Class ( typarms = tprms, t_extends = extend, decls = members) =>
def qtparms = quoted_tparms (tprms.tyvars, tprms.constraints);
def qexten = Lift (extend, quoted_expr);
- def qmems = Lift (members, quoted_member);
+ def qmems = lift_members (members);
<[ TopDeclaration.Class (name = $qn, modifiers = $qattr, t_extends = $qexten,
typarms = $qtparms, decls = $qmems) ]>
@@ -387,7 +393,7 @@
| TopDeclaration.Interface (typarms = tprms, t_extends = extend, methods = members) =>
def qtparms = quoted_tparms (tprms.tyvars, tprms.constraints);
def qexten = Lift (extend, quoted_expr);
- def qmems = Lift (members, quoted_member);
+ def qmems = lift_members (members);
<[ TopDeclaration.Interface (name = $qn, modifiers = $qattr, t_extends = $qexten,
typarms = $qtparms, methods = $qmems) ]>
@@ -395,13 +401,13 @@
| TopDeclaration.Variant (typarms = tprms, t_extends = extend, decls = members) =>
def qtparms = quoted_tparms (tprms.tyvars, tprms.constraints);
def qexten = Lift (extend, quoted_expr);
- def qmems = Lift (members, quoted_member);
+ def qmems = lift_members (members);
<[ TopDeclaration.Variant (name = $qn, modifiers = $qattr, t_extends = $qexten,
typarms = $qtparms, decls = $qmems) ]>
| TopDeclaration.VariantOption (decls = members) =>
- def qmems = Lift (members, quoted_member);
+ def qmems = lift_members (members);
<[ TopDeclaration.VariantOption (name = $qn, modifiers = $qattr, decls = $qmems) ]>
More information about the svn
mailing list