Diff
Not logged in

Differences From Artifact [84ee94a6f293fac0]:

To Artifact [360da420d41dfbbf]:


126 126 } 127 127 }, 128 128 (LayeredExpression e) 129 129 { 130 130 if( e.lay == "@macro" ) 131 131 return macroEval(e.expr, ctx, false); 132 132 else 133 - return eval(e.expr, ctx, false, e.lay); 133 + return eval(e.expr, ctx, true, e.lay); 134 134 }, 135 135 (LetExpression e) 136 136 { 137 137 // for letrec, we need this, but should avoid overwriting???? 138 138 // ctx.set(e.var, "@v", new UndefinedValue, e.pos); 139 - Value v = eval(e.init, ctx, true, lay); 140 139 if(splitCtx) 141 140 ctx = new Table(ctx, Table.Kind.NotPropagateSet); 141 + Value v = eval(e.init, ctx, true, lay); 142 142 ctx.set(e.var, (e.layer.length ? e.layer : lay), v, e.pos); 143 143 return eval(e.expr, ctx, false, lay); 144 144 }, 145 145 (FuncallExpression e) 146 146 { 147 147 Value _f = eval(e.fun, ctx, true, lay); 148 148 if( auto f = cast(FunValue)_f ) { ................................................................................ 379 379 assert_eq( evalString(`@@s(x){x}; @s "+"=fun(x,y){@v(@s(x)-@s(y))};1+2`).val, new IntValue(BigInt(3)) ); 380 380 assert_eq( evalString(`@@s(x){x}; @s "+"=fun(x,y){@v(@s(x)-@s(y))};@s(1+2)`).val, new IntValue(BigInt(-1)) ); 381 381 } 382 382 383 383 unittest 384 384 { 385 385 assert_eq( evalString(`@@t = fun(x){x+1}; @t(123)`).val, new IntValue(BigInt(124)) ); 386 + // there was a bug that declaration in the first line of function definition 387 + // cannot be recursive 388 + assert_nothrow( evalString(`def foo() { 389 + def bar(y) { if(y<1) {0} else {bar(0)} }; 390 + bar(1) 391 +}; foo()`) ); 386 392 }