diff --git a/src/interpreter.ts b/src/interpreter.ts index ea319ec..684c4d8 100644 --- a/src/interpreter.ts +++ b/src/interpreter.ts @@ -65,7 +65,7 @@ export function evaluate(ast: AST, env: Env): Value { return { kind: 'constructor', name: ast.name, - args: [] // TODO: constructors args + args: [] }; case 'let': { @@ -105,6 +105,16 @@ export function evaluate(ast: AST, env: Env): Value { const func = evaluate(ast.func, env); + // Constructor application + if (func.kind === 'constructor') { + const argValues = ast.args.map(arg => evaluate(arg, env)); + return { + kind: 'constructor', + name: func.name, + args: [...func.args, ...argValues] + }; + } + if (func.kind !== 'closure') throw new Error('Not a function'); diff --git a/src/main.ts b/src/main.ts index b94d137..1904586 100644 --- a/src/main.ts +++ b/src/main.ts @@ -37,3 +37,11 @@ e(`factorial = n \\ n | n \\ n * factorial (n - 1); factorial 5`) + +e(`factorial = n \\ n + | 0 \\ 1 + | n \\ n * factorial (n - 1); + + factorial 5`) + +e('some5 = Some 5; some5');