summaryrefslogtreecommitdiff
path: root/src/interpreter/interpreter.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/interpreter/interpreter.ts')
-rw-r--r--src/interpreter/interpreter.ts44
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 = (