diff options
Diffstat (limited to 'src/interpreter/interpreter.ts')
-rw-r--r-- | src/interpreter/interpreter.ts | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/src/interpreter/interpreter.ts b/src/interpreter/interpreter.ts index ebd605c..94e263c 100644 --- a/src/interpreter/interpreter.ts +++ b/src/interpreter/interpreter.ts @@ -29,7 +29,6 @@ const evaluateValue = ( return { type: 'int', value: value.int }; } if ('name' in value) { - logger.debug(`Evaluating variable: ${value.name}`); return env.get(value.name); } @@ -42,10 +41,6 @@ const evaluatePrimitiveOperation = ( logger: TracingLogger, ) => { const { opr, operands, resultBindings, continuations } = primitiveOperation; - if (operands.length !== 2) { - throw new BadArgumentError('Primitive operations must have 2 operands'); - } - const operandValues = operands.map(operand => evaluateValue(operand, env, logger.createChild('evaluteValue')), ); @@ -56,15 +51,46 @@ const evaluatePrimitiveOperation = ( continuationEnvironment.set(name, result); } - // return the result of the last continuation - return continuations.reduce((_, continuation, i) => { - const childLogger = logger.createChild(`continuation[${i}]`); + if (result.type === 'bool') { + if (continuations.length > 2) { + throw new BadArgumentError( + `Expected <= 2 continuations for boolean result, got ${continuations.length}`, + ); + } + if (continuations.length !== 2) { + logger.warn( + `Expected 2 continuations for boolean result, got ContinuationLength=(${continuations.length})`, + ); + } + + const [trueContinuation, falseContinuation] = continuations; + const childLogger = logger.createChild('continuation[true]'); + const continuation = result.value ? trueContinuation : falseContinuation; return evaluteContinuationExpression( continuation, continuationEnvironment, childLogger, ); - }, result); + } + + if (continuations.length > 1) { + throw new BadArgumentError( + `Expected <= 1 continuations for non-boolean result, got ${continuations.length}`, + ); + } else if (continuations.length === 0) { + logger.warn( + `!! Expected 1 continuation in continuation list... implicitly returning result but PLEASE NOTE this is technically undefined behavior !!`, + ); + return result; + } + + const [continuation] = continuations; + const childLogger = logger.createChild('continuation'); + return evaluteContinuationExpression( + continuation, + continuationEnvironment, + childLogger, + ); }; const evaluteContinuationExpression = ( |