Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
marihachi committed Aug 22, 2023
1 parent dd8e9e7 commit 5a7d338
Show file tree
Hide file tree
Showing 7 changed files with 162 additions and 215 deletions.
53 changes: 25 additions & 28 deletions src/lib/running/binary-expr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,8 @@ import {
assertValue,
BoolValue,
CharValue,
createBoolValue,
createNumberValue,
FunctionValue,
getTypeName,
getValueKind,
isNoneValue,
NumberValue,
StringValue,
Expand All @@ -22,10 +19,10 @@ export function evalLogicalBinaryOp(op: LogicalBinaryOperator, left: Value, righ
assertValue(right, 'BoolValue');
switch (op) {
case Token.And2: {
return new Complete(createBoolValue(left && right));
return new Complete(new BoolValue(left.raw && right.raw));
}
case Token.Or2: {
return new Complete(createBoolValue(left || right));
return new Complete(new BoolValue(left.raw || right.raw));
}
}
}
Expand All @@ -37,16 +34,16 @@ export function evalEquivalentBinaryOp(op: EquivalentOperator, left: Value, righ
if (isNoneValue(right)) {
throw new UguisuError('no values');
}
switch (getValueKind(left)) {
switch (left.kind) {
case 'NumberValue': {
left = left as NumberValue;
assertValue(right, 'NumberValue');
switch (op) {
case Token.Eq2: {
return new Complete(createBoolValue(left == right));
return new Complete(new BoolValue(left.raw === right.raw));
}
case Token.NotEq: {
return new Complete(createBoolValue(left != right));
return new Complete(new BoolValue(left.raw !== right.raw));
}
}
break;
Expand All @@ -56,10 +53,10 @@ export function evalEquivalentBinaryOp(op: EquivalentOperator, left: Value, righ
assertValue(right, 'BoolValue');
switch (op) {
case Token.Eq2: {
return new Complete(createBoolValue(left == right));
return new Complete(new BoolValue(left.raw == right.raw));
}
case Token.NotEq: {
return new Complete(createBoolValue(left != right));
return new Complete(new BoolValue(left.raw != right.raw));
}
}
break;
Expand All @@ -69,10 +66,10 @@ export function evalEquivalentBinaryOp(op: EquivalentOperator, left: Value, righ
assertValue(right, 'CharValue');
switch (op) {
case Token.Eq2: {
return new Complete(createBoolValue(left == right));
return new Complete(new BoolValue(left.raw == right.raw));
}
case Token.NotEq: {
return new Complete(createBoolValue(left != right));
return new Complete(new BoolValue(left.raw != right.raw));
}
}
break;
Expand All @@ -82,10 +79,10 @@ export function evalEquivalentBinaryOp(op: EquivalentOperator, left: Value, righ
assertValue(right, 'StringValue');
switch (op) {
case Token.Eq2: {
return new Complete(createBoolValue(left == right));
return new Complete(new BoolValue(left.raw == right.raw));
}
case Token.NotEq: {
return new Complete(createBoolValue(left != right));
return new Complete(new BoolValue(left.raw != right.raw));
}
}
break;
Expand All @@ -104,10 +101,10 @@ export function evalEquivalentBinaryOp(op: EquivalentOperator, left: Value, righ
assertValue(right, 'FunctionValue');
switch (op) {
case Token.Eq2: {
return new Complete(createBoolValue(equalFunc(left, right)));
return new Complete(new BoolValue(equalFunc(left, right)));
}
case Token.NotEq: {
return new Complete(createBoolValue(!equalFunc(left, right)));
return new Complete(new BoolValue(!equalFunc(left, right)));
}
}
break;
Expand All @@ -117,7 +114,7 @@ export function evalEquivalentBinaryOp(op: EquivalentOperator, left: Value, righ
break;
}
}
throw new UguisuError(`type \`${getTypeName(getValueKind(left))}\` cannot be used for equivalence comparisons.`);
throw new UguisuError(`type \`${getTypeName(left.kind)}\` cannot be used for equivalence comparisons.`);
}

export function evalOrderingBinaryOp(op: OrderingOperator, left: Value, right: Value): EvalResult<BoolValue> {
Expand All @@ -127,22 +124,22 @@ export function evalOrderingBinaryOp(op: OrderingOperator, left: Value, right: V
if (isNoneValue(right)) {
throw new UguisuError('no values');
}
switch (getValueKind(left)) {
switch (left.kind) {
case 'NumberValue': {
left = left as NumberValue;
assertValue(right, 'NumberValue');
switch (op) {
case Token.LessThan: {
return new Complete(createBoolValue(left < right));
return new Complete(new BoolValue(left.raw < right.raw));
}
case Token.LessThanEq: {
return new Complete(createBoolValue(left <= right));
return new Complete(new BoolValue(left.raw <= right.raw));
}
case Token.GreaterThan: {
return new Complete(createBoolValue(left > right));
return new Complete(new BoolValue(left.raw > right.raw));
}
case Token.GreaterThanEq: {
return new Complete(createBoolValue(left >= right));
return new Complete(new BoolValue(left.raw >= right.raw));
}
}
break;
Expand All @@ -156,27 +153,27 @@ export function evalOrderingBinaryOp(op: OrderingOperator, left: Value, right: V
break;
}
}
throw new UguisuError(`type \`${getTypeName(getValueKind(left))}\` cannot be used to compare large and small relations.`);
throw new UguisuError(`type \`${getTypeName(left.kind)}\` cannot be used to compare large and small relations.`);
}

export function evalArithmeticBinaryOp(op: ArithmeticOperator, left: Value, right: Value): EvalResult<NumberValue> {
assertValue(left, 'NumberValue');
assertValue(right, 'NumberValue');
switch (op) {
case Token.Plus: {
return new Complete(createNumberValue(left + right));
return new Complete(new NumberValue(left.raw + right.raw));
}
case Token.Minus: {
return new Complete(createNumberValue(left - right));
return new Complete(new NumberValue(left.raw - right.raw));
}
case Token.Asterisk: {
return new Complete(createNumberValue(left * right));
return new Complete(new NumberValue(left.raw * right.raw));
}
case Token.Slash: {
return new Complete(createNumberValue(left / right));
return new Complete(new NumberValue(left.raw / right.raw));
}
case Token.Percent: {
return new Complete(createNumberValue(left % right));
return new Complete(new NumberValue(left.raw % right.raw));
}
}
}
60 changes: 30 additions & 30 deletions src/lib/running/builtins.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import {
ArrayValue,
assertValue,
CharValue,
createNoneValue,
createNumberValue,
createStringValue,
FunctionValue,
NoneValue,
NumberValue,
StringValue,
StructValue,
Value
} from './value.js';
Expand All @@ -30,8 +30,8 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
throw new UguisuError('invalid arguments count');
}
assertValue(args[0], 'StringValue');
const parsedValue = Number(args[0]);
return createNumberValue(parsedValue);
const parsedValue = Number(args[0].raw);
return new NumberValue(parsedValue);
});
setItem('parse', parse);

Expand All @@ -40,7 +40,7 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
throw new UguisuError('invalid arguments count');
}
assertValue(args[0], 'NumberValue');
return createStringValue(args[0].toString());
return new StringValue(args[0].raw.toString());
});
setItem('toString', toString);

Expand All @@ -50,12 +50,12 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
}
assertValue(args[0], 'NumberValue');
assertValue(args[1], 'NumberValue');
const actual = args[0];
const expected = args[1];
const actual = args[0].raw;
const expected = args[1].raw;
if (actual != expected) {
throw new UguisuError(`assertion error. expected \`${expected}\`, actual \`${actual}\`.`);
}
return createNoneValue();
return new NoneValue();
});
setItem('assertEq', assertEq);
});
Expand All @@ -66,7 +66,7 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
throw new UguisuError('invalid arguments count');
}
assertValue(args[0], 'NumberValue');
const charCode = args[0];
const charCode = args[0].raw;
const charValue = String.fromCodePoint(charCode);
return new CharValue(charValue);
});
Expand All @@ -79,7 +79,7 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
assertValue(args[0], 'CharValue');
const charValue = args[0];
const charCode = charValue.raw.codePointAt(0)!;
return createNumberValue(charCode);
return new NumberValue(charCode);
});
setItem('toNumber', toNumber);

Expand All @@ -88,7 +88,7 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
throw new UguisuError('invalid arguments count');
}
assertValue(args[0], 'CharValue');
return createStringValue(args[0].raw);
return new StringValue(args[0].raw);
});
setItem('toString', toString);
});
Expand All @@ -100,7 +100,7 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
}
assertValue(args[0], 'StringValue');
assertValue(args[1], 'StringValue');
return createStringValue(args[0] + args[1]);
return new StringValue(args[0].raw + args[1].raw);
});
setItem('concat', concat);

Expand All @@ -118,7 +118,7 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
assertValue(s.value, 'CharValue');
arr.push(s.value.raw);
}
return createStringValue(arr.join(''));
return new StringValue(arr.join(''));
});
setItem('fromChars', fromChars);

Expand All @@ -128,7 +128,7 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
}
assertValue(args[0], 'StringValue');
const src = args[0];
const arr = src.match(charRegex());
const arr = src.raw.match(charRegex());
if (arr == null) {
return new ArrayValue([]);
}
Expand All @@ -142,12 +142,12 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
}
assertValue(args[0], 'StringValue');
assertValue(args[1], 'StringValue');
const actual = args[0];
const expected = args[1];
const actual = args[0].raw;
const expected = args[1].raw;
if (actual != expected) {
throw new UguisuError(`assertion error. expected \`${expected}\`, actual \`${actual}\`.`);
}
return createNoneValue();
return new NoneValue();
});
setItem('assertEq', assertEq);
});
Expand All @@ -160,10 +160,10 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
assertValue(args[0], 'ArrayValue');
assertValue(args[1], 'NumberValue');
const target = args[0];
const index = args[1];
const index = args[1].raw;
const symbol = new Symbol(args[2]);
target.insert(index, symbol);
return createNoneValue();
return new NoneValue();
});
setItem('insert', insert);

Expand All @@ -175,7 +175,7 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
const target = args[0];
const symbol = new Symbol(args[1]);
target.insert(target.count(), symbol);
return createNoneValue();
return new NoneValue();
});
setItem('add', add);

Expand All @@ -186,9 +186,9 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
assertValue(args[0], 'ArrayValue');
assertValue(args[1], 'NumberValue');
const target = args[0];
const index = args[1];
const index = args[1].raw;
target.removeAt(index);
return createNoneValue();
return new NoneValue();
});
setItem('removeAt', removeAt);

Expand All @@ -198,7 +198,7 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
}
assertValue(args[0], 'ArrayValue');
const target = args[0];
return createNumberValue(target.count());
return new NumberValue(target.count());
});
setItem('count', count);
});
Expand All @@ -210,9 +210,9 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
}
assertValue(args[0], 'StringValue');
if (options.stdout) {
options.stdout(args[0]);
options.stdout(args[0].raw);
}
return createNoneValue();
return new NoneValue();
});
setItem('write', write);

Expand All @@ -222,9 +222,9 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
}
assertValue(args[0], 'NumberValue');
if (options.stdout) {
options.stdout(args[0].toString());
options.stdout(args[0].raw.toString());
}
return createNoneValue();
return new NoneValue();
});
setItem('writeNum', writeNum);

Expand All @@ -235,7 +235,7 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
if (!options.stdin) {
throw new UguisuError('stdin not found');
}
return createStringValue(options.stdin());
return new StringValue(options.stdin());
});
setItem('read', read);
});
Expand All @@ -245,7 +245,7 @@ export function setRuntime(env: RunningEnv, options: UguisuOptions) {
throw new UguisuError('invalid arguments count');
}
const unixTime = Math.floor(Date.now() / 1000);
return createNumberValue(unixTime);
return new NumberValue(unixTime);
});
env.declare('getUnixtime', getUnixtime);
}
Loading

0 comments on commit 5a7d338

Please sign in to comment.