|
|
|
|
@ -13,6 +13,28 @@ export function evaluate(ast: AST, env: Env): Value {
|
|
|
|
|
throw new Error(`Unknown variable: ${ast.name}`);
|
|
|
|
|
return val;
|
|
|
|
|
|
|
|
|
|
case 'list':
|
|
|
|
|
return {
|
|
|
|
|
kind: 'list',
|
|
|
|
|
elements: ast.elements.map(el => evaluate(el, env))
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
case 'record':
|
|
|
|
|
const fields: { [key: string]: Value } = {};
|
|
|
|
|
|
|
|
|
|
Object.entries(ast.fields).forEach(([k, v]) => {
|
|
|
|
|
fields[k] = evaluate(v, env);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return { kind: 'record', fields };
|
|
|
|
|
|
|
|
|
|
case 'constructor':
|
|
|
|
|
return {
|
|
|
|
|
kind: 'constructor',
|
|
|
|
|
name: ast.name,
|
|
|
|
|
args: [] // TODO: constructors args
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
case 'let':
|
|
|
|
|
const val2 = evaluate(ast.value, env);
|
|
|
|
|
const newEnv = new Map(env).set(ast.name, val2);
|
|
|
|
|
|