From b5bd084ee470d841a550781d45edddb6f01b29f5 Mon Sep 17 00:00:00 2001 From: Dustin Swan Date: Sun, 1 Feb 2026 16:20:13 -0700 Subject: [PATCH] interpreting lists, records, constructors --- src/ast.ts | 10 +++++----- src/interpreter.ts | 22 ++++++++++++++++++++++ src/main.ts | 4 +++- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/ast.ts b/src/ast.ts index 416c069..e608f63 100644 --- a/src/ast.ts +++ b/src/ast.ts @@ -63,6 +63,11 @@ export type Pattern = // Data Structures +export type List = { + kind: 'list' + elements: AST[] +} + export type Record = { kind: 'record' fields: { [key: string]: AST } @@ -80,11 +85,6 @@ export type RecordUpdate = { updates: { [key: string]: AST } } -export type List = { - kind: 'list' - elements: AST[] -} - // Top-level constructs export type Definition = { diff --git a/src/interpreter.ts b/src/interpreter.ts index 849ea47..9c4d071 100644 --- a/src/interpreter.ts +++ b/src/interpreter.ts @@ -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); diff --git a/src/main.ts b/src/main.ts index 5abc261..17e6278 100644 --- a/src/main.ts +++ b/src/main.ts @@ -27,7 +27,9 @@ console.log(tokenize(str)); // const tokens2 = tokenize("(x, y) => x + y"); // const tokens2 = tokenize('point { x = 3 }'); // const tokens2 = tokenize('add1 = (x \\ x + 1); add1 3'); -const tokens2 = tokenize('sum = x y \\ x + y; sum 5 3'); +// const tokens2 = tokenize('sum = x y \\ x + y; sum 5 3'); +// const tokens2 = tokenize('[1, 2, 3]'); +const tokens2 = tokenize('c = 5; { a = 3, b = c }'); const p2 = new Parser(tokens2); const ast3 = p2.parse(); console.log(ast3);