Differences From Artifact [74dd93745d781116]:
- File
polemy/eval.d
- 2010-11-26 05:03:10 - part of checkin [207cea338a] on branch trunk - changed hiding mechanizem of x in let x = ... for @macro layer. Old: set(x,ValueLayer,undefined) Nee: set(x,NoopLayer,null) (user: kinaba) [annotate]
To Artifact [56f0a662740b0906]:
- File
polemy/eval.d
- 2010-11-26 05:29:24 - part of checkin [f8684f4d69] on branch trunk - changed the desugaring of >>@macro x=e from >>@macro x=e in x to >>@macro x=e in "(macro definition)" for convenience during REPL interaction (user: kinaba) [annotate]
135 135
136 Value eval( Let e, Layer lay, Table ctx, bool overwriteCtx=CascadeCtx ) 136 Value eval( Let e, Layer lay, Table ctx, bool overwriteCtx=CascadeCtx )
137 { 137 {
138 Table newCtx = overwriteCtx ? ctx : new Table(ctx, Table.Kind.No 138 Table newCtx = overwriteCtx ? ctx : new Table(ctx, Table.Kind.No
139 if( isASTLayer(lay) ) 139 if( isASTLayer(lay) )
140 return ast2table(e, (AST ee){ 140 return ast2table(e, (AST ee){
141 // need this for correct scoping (outer scope ma 141 // need this for correct scoping (outer scope ma
142 if(ee is e.expr) | 142 if(e.name!="_" && ee is e.expr)
143 newCtx.set(e.name, NoopLayer, null); 143 newCtx.set(e.name, NoopLayer, null);
144 return eval(ee,lay,newCtx); 144 return eval(ee,lay,newCtx);
145 }); 145 });
146 else 146 else
147 { 147 {
148 Value ri = eval(e.init, lay, newCtx); 148 Value ri = eval(e.init, lay, newCtx);
> 149 if(e.name!="_")
149 newCtx.set(e.name, e.layer.empty ? lay : e.layer, ri); | 150 newCtx.set(e.name, e.layer.empty ? lay : e.layer
150 return eval(e.expr, lay, newCtx, OverwriteCtx); 151 return eval(e.expr, lay, newCtx, OverwriteCtx);
151 } 152 }
152 } 153 }
153 154
154 private: 155 private:
155 // little little bit incremental macro defining version. 156 // little little bit incremental macro defining version.
156 // enables @macro foo(x)=... in ... foo ..., only at the top level of th 157 // enables @macro foo(x)=... in ... foo ..., only at the top level of th
................................................................................................................................................................................
459 } 460 }
460 unittest 461 unittest
461 { 462 {
462 auto e = new Evaluator; 463 auto e = new Evaluator;
463 enrollRuntimeLibrary(e); 464 enrollRuntimeLibrary(e);
464 assert_nothrow( e.evalString(`case 1`) ); 465 assert_nothrow( e.evalString(`case 1`) );
465 assert_nothrow( e.evalString(`case 1 when 1: 2`) ); 466 assert_nothrow( e.evalString(`case 1 when 1: 2`) );
> 467
> 468 // this is a shorthand for
> 469 // @macro x = fun(){} in @macro(x)
> 470 // so it is ok to fail, but it is really incovenient on REPL
> 471 assert_nothrow( e.evalString(`@macro x=fun(){}`) );
466 } 472 }
467 473
468 /* 474 /*
469 unittest 475 unittest
470 { 476 {
471 assert_eq( evalString(`var fac = fun(x){ 477 assert_eq( evalString(`var fac = fun(x){
472 if(x) 478 if(x)