@@ -121,10 +121,16 @@ ? parseLambdaAfterOpenParen(pos) // let var ( ... : (eat("=", "after "~kwd), E(0)); // let var = ... if( moreDeclarationExists() ) return new Let(pos, var, layer, e, Body()); - else - return new Let(pos, var, layer, e, new Var(varpos, var)); + else { + if( layer.empty ) + return new Let(pos, var, layer, e, new Var(varpos, var)); + else if( isMacroLayer(layer) ) + return new Let(pos, var, layer, e, new Str(varpos, "(macro definition)")); + else + return new Let(pos, var, layer, e, new Lay(varpos, layer, new Var(varpos, var))); + } } } AST TopLevelExpression() @@ -570,16 +576,17 @@ assert_eq(parseString(`"foo"`), strl("foo")); assert_eq(parseString(`fun(){1}`), fun([],intl(1))); assert_eq(parseString(`fun(x){1}`), fun(["x"],intl(1))); assert_eq(parseString("\u03BB(){1}"), fun([],intl(1))); - assert_eq(parseString("\u03BB(x){1}"), fun(["x"],intl(1))); + assert_eq(parseString("\u03BB(x,y){1}"), fun(["x","y"],intl(1))); assert_eq(parseString(`1;2`), let("_","",intl(1),intl(2))); assert_eq(parseString(`1;2;`), let("_","",intl(1),intl(2))); assert_eq(parseString(`let x=1 in 2`), let("x","",intl(1),intl(2))); assert_eq(parseString(`var x=1;2;`), let("x","",intl(1),intl(2))); assert_eq(parseString(`def x=1`), let("x","",intl(1),var("x"))); - assert_eq(parseString(`@val x=1;`), let("x","@val",intl(1),var("x"))); - assert_eq(parseString(`@typ x="#int";`), let("x","@typ",strl("#int"),var("x"))); + assert_eq(parseString(`@val x=1;`), let("x","@val",intl(1),lay("@val",var("x")))); + assert_eq(parseString(`@typ x="#int";`), let("x","@typ",strl("#int"),lay("@typ",var("x")))); + assert_eq(parseString(`@macro x=1`), let("x","@macro",intl(1),strl("(macro definition)"))); assert_eq(parseString(`f(1,2)`), call(var("f"),intl(1),intl(2))); assert_eq(parseString(`if 1 then 2`), call(var("if"),intl(1),fun([],intl(2)),fun([],strl("(empty function body)")))); assert_eq(parseString(`if 1 then: 2 else(3)`), call(var("if"),intl(1),fun([],intl(2)),fun([],intl(3)))); assert_eq(parseString(`(if 1 then () else 3)()()`),