Skip to content

Commit

Permalink
chuck: merge eval_ast and macroexpand into EVAL
Browse files Browse the repository at this point in the history
Simplify eval_ast.

The lines with only a brace confuse diff, so in order to keep the
commit readable, eval_ast remains a separate function, only in charge
of types other than list.
  • Loading branch information
asarhaddon committed Oct 22, 2024
1 parent d1cc553 commit a1229ec
Show file tree
Hide file tree
Showing 9 changed files with 297 additions and 496 deletions.
56 changes: 26 additions & 30 deletions impls/chuck/step2_eval.ck
Original file line number Diff line number Diff line change
Expand Up @@ -27,23 +27,35 @@ fun MalObject READ(string input)

fun MalObject EVAL(MalObject m, MalSubr env[])
{

// Util.println("EVAL: " + Printer.pr_str(m, true));

if( m.type == "list" )
{
if( m.objects.size() == 0 )
{
return m;
}

eval_ast(m, env) @=> MalObject result;
if( result.type == "error" )
EVAL(ast[0], env) @=> MalObject first;
first.type => string type;
if( type == "error" )
{
return result;
return first;
}

result.malObjectValues() @=> MalObject values[];
values[0]$MalSubr @=> MalSubr subr;
MalObject.slice(values, 1) @=> MalObject args[];
MalObject args[ast.size() - 1];
for( 0 => int i; i < args.size(); i++ )
{
EVAL(ast[i + 1], env) @=> result;
if( result.type == "error" )
{
return result;
}
result @=> args[i];
}

first$MalSubr @=> MalSubr subr;
return subr.call(args);
}
else
Expand All @@ -70,13 +82,11 @@ fun MalObject eval_ast(MalObject m, MalSubr env[])
return subr;
}
}
else if( type == "list" || type == "vector" || type == "hashmap" )
else if( type == "vector" )
{
m.malObjectValues() @=> MalObject values[];
MalObject results[values.size()];

if( type != "hashmap" )
{
for( 0 => int i; i < values.size(); i++ )
{
EVAL(values[i], env) @=> MalObject result;
Expand All @@ -88,9 +98,13 @@ fun MalObject eval_ast(MalObject m, MalSubr env[])

result @=> results[i];
}
}
else
{
return MalVector.create(results);
}
else if( type == "hashmap" )
{
m.malObjectValues() @=> MalObject values[];
MalObject results[values.size()];

for( 0 => int i; i < values.size(); i++ )
{
if( i % 2 == 0 )
Expand All @@ -102,25 +116,7 @@ fun MalObject eval_ast(MalObject m, MalSubr env[])
EVAL(values[i], env) @=> results[i];
}
}
}

if( type == "list" )
{
return MalList.create(results);
}
else if( type == "vector" )
{
return MalVector.create(results);
}
else if( type == "hashmap" )
{
return MalHashMap.create(results);
}
else
{
Util.panic("Programmer error (exhaustive match)");
return null;
}
}
else
{
Expand Down
53 changes: 23 additions & 30 deletions impls/chuck/step3_env.ck
Original file line number Diff line number Diff line change
Expand Up @@ -78,16 +78,25 @@ fun MalObject EVAL(MalObject m, Env env)
return EVAL(ast[2], let_env);
}

eval_ast(m, env) @=> MalObject result;
if( result.type == "error" )
EVAL(ast[0], env) @=> MalObject first;
first.type => string type;
if( type == "error" )
{
return result;
return first;
}

result.malObjectValues() @=> MalObject values[];
values[0]$MalSubr @=> MalSubr subr;
MalObject.slice(values, 1) @=> MalObject args[];
MalObject args[ast.size() - 1];
for( 0 => int i; i < args.size(); i++ )
{
EVAL(ast[i + 1], env) @=> result;
if( result.type == "error" )
{
return result;
}
result @=> args[i];
}

first$MalSubr @=> MalSubr subr;
return subr.call(args);
}
else
Expand All @@ -105,13 +114,11 @@ fun MalObject eval_ast(MalObject m, Env env)
{
return env.get(m.stringValue);
}
else if( type == "list" || type == "vector" || type == "hashmap" )
else if( type == "vector" )
{
m.malObjectValues() @=> MalObject values[];
MalObject results[values.size()];

if( type != "hashmap" )
{
for( 0 => int i; i < values.size(); i++ )
{
EVAL(values[i], env) @=> MalObject result;
Expand All @@ -123,9 +130,13 @@ fun MalObject eval_ast(MalObject m, Env env)

result @=> results[i];
}
}
else
{
return MalVector.create(results);
}
else if( type == "hashmap" )
{
m.malObjectValues() @=> MalObject values[];
MalObject results[values.size()];

for( 0 => int i; i < values.size(); i++ )
{
if( i % 2 == 0 )
Expand All @@ -137,25 +148,7 @@ fun MalObject eval_ast(MalObject m, Env env)
EVAL(values[i], env) @=> results[i];
}
}
}

if( type == "list" )
{
return MalList.create(results);
}
else if( type == "vector" )
{
return MalVector.create(results);
}
else if( type == "hashmap" )
{
return MalHashMap.create(results);
}
else
{
Util.panic("Programmer error (exhaustive match)");
return null;
}
}
else
{
Expand Down
68 changes: 29 additions & 39 deletions impls/chuck/step4_if_fn_do.ck
Original file line number Diff line number Diff line change
Expand Up @@ -83,17 +83,15 @@ fun MalObject EVAL(MalObject m, Env env)
}
else if( a0 == "do" )
{
MalObject.slice(ast, 1) @=> MalObject forms[];
eval_ast(MalList.create(forms), env) @=> MalObject value;

for( 1 => int i; i < values.size(); i++ )
{
EVAL(values[i], env) => value;
if( value.type == "error" )
{
return value;
}

value.malObjectValues() @=> MalObject values[];

return values[values.size()-1];
}
return value;
}
else if( a0 == "if" )
{
Expand Down Expand Up @@ -136,24 +134,32 @@ fun MalObject EVAL(MalObject m, Env env)
}
}

eval_ast(m, env) @=> MalObject result;
if( result.type == "error" )
EVAL(ast[0], env) @=> MalObject first;
first.type => string type;
if( type == "error" )
{
return result;
return first;
}

result.malObjectValues() @=> MalObject values[];
values[0].type => string type;
MalObject.slice(values, 1) @=> MalObject args[];
MalObject args[ast.size() - 1];
for( 0 => int i; i < args.size(); i++ )
{
EVAL(ast[i + 1], env) @=> result;
if( result.type == "error" )
{
return result;
}
result @=> args[i];
}

if( type == "subr" )
{
values[0]$MalSubr @=> MalSubr subr;
first$MalSubr @=> MalSubr subr;
return subr.call(args);
}
else // type == "func"
{
values[0]$Func @=> Func func;
first$Func @=> Func func;
Env.create(func.env, func.args, args) @=> Env eval_env;
return EVAL(func.ast, eval_env);
}
Expand All @@ -173,13 +179,11 @@ fun MalObject eval_ast(MalObject m, Env env)
{
return env.get(m.stringValue);
}
else if( type == "list" || type == "vector" || type == "hashmap" )
else if( type == "vector" )
{
m.malObjectValues() @=> MalObject values[];
MalObject results[values.size()];

if( type != "hashmap" )
{
for( 0 => int i; i < values.size(); i++ )
{
EVAL(values[i], env) @=> MalObject result;
Expand All @@ -191,9 +195,13 @@ fun MalObject eval_ast(MalObject m, Env env)

result @=> results[i];
}
}
else
{
return MalVector.create(results);
}
else if( type == "hashmap" )
{
m.malObjectValues() @=> MalObject values[];
MalObject results[values.size()];

for( 0 => int i; i < values.size(); i++ )
{
if( i % 2 == 0 )
Expand All @@ -205,25 +213,7 @@ fun MalObject eval_ast(MalObject m, Env env)
EVAL(values[i], env) @=> results[i];
}
}
}

if( type == "list" )
{
return MalList.create(results);
}
else if( type == "vector" )
{
return MalVector.create(results);
}
else if( type == "hashmap" )
{
return MalHashMap.create(results);
}
else
{
Util.panic("Programmer error (exhaustive match)");
return null;
}
}
else
{
Expand Down
Loading

0 comments on commit a1229ec

Please sign in to comment.