|
@@ -1,4 +1,3 @@
|
|
|
-import { StoreObject } from '../store/storeObject';
|
|
|
import * as Commands from './../../ast/commands';
|
|
|
import { Types } from './../../typeSystem/types';
|
|
|
import { toReal } from "./../../typeSystem/parsers";
|
|
@@ -6,7 +5,7 @@ import { Decimal } from 'decimal.js';
|
|
|
import { MultiType } from '../../typeSystem/multiType';
|
|
|
import { ArrayType } from '../../typeSystem/array_type';
|
|
|
import { Modes } from '../modes';
|
|
|
-import { Config } from '../../util/config';
|
|
|
+import { StoreValue } from '../store/value/store_value';
|
|
|
|
|
|
/**
|
|
|
* sin
|
|
@@ -29,7 +28,7 @@ function convertToRadians (degrees) {
|
|
|
export function createSinFun () {
|
|
|
const sinFun = (sto, _) => {
|
|
|
const x = sto.applyStore('x');
|
|
|
- const angle = x.value.mod(360);
|
|
|
+ const angle = x.get().mod(360);
|
|
|
let result = null;
|
|
|
if(angle.eq(90)) {
|
|
|
result = new Decimal(1);
|
|
@@ -40,12 +39,10 @@ export function createSinFun () {
|
|
|
} else {
|
|
|
result = Decimal.sin(convertToRadians(angle));
|
|
|
}
|
|
|
- // if(result.dp() > Config.decimalPlaces) {
|
|
|
- // result = new Decimal(result.toFixed(Config.decimalPlaces));
|
|
|
- // }
|
|
|
- const temp = new StoreObject(Types.REAL, result);
|
|
|
+ const temp = new StoreValue(Types.REAL, result);
|
|
|
+ sto.insertStore("$", temp);
|
|
|
sto.mode = Modes.RETURN;
|
|
|
- return Promise.resolve(sto.updateStore('$', temp));
|
|
|
+ return Promise.resolve(sto);
|
|
|
};
|
|
|
|
|
|
const block = new Commands.CommandBlock([], [new Commands.SysCall(sinFun)]);
|
|
@@ -58,7 +55,7 @@ export function createSinFun () {
|
|
|
export function createCosFun () {
|
|
|
const cosFun = (sto, _) => {
|
|
|
const x = sto.applyStore('x');
|
|
|
- const angle = x.value.mod(360);
|
|
|
+ const angle = x.get().mod(360);
|
|
|
let result = null;
|
|
|
if(angle.eq(90)) {
|
|
|
result = new Decimal(0);
|
|
@@ -68,12 +65,10 @@ export function createCosFun () {
|
|
|
result = new Decimal(0)
|
|
|
}
|
|
|
result = Decimal.cos(convertToRadians(angle));
|
|
|
- // if(result.dp() > Config.decimalPlaces) {
|
|
|
- // result = new Decimal(result.toFixed(Config.decimalPlaces));
|
|
|
- // }
|
|
|
- const temp = new StoreObject(Types.REAL, result);
|
|
|
+ const temp = new StoreValue(Types.REAL, result);
|
|
|
+ sto.insertStore("$", temp);
|
|
|
sto.mode = Modes.RETURN;
|
|
|
- return Promise.resolve(sto.updateStore('$', temp));
|
|
|
+ return Promise.resolve(sto);
|
|
|
};
|
|
|
|
|
|
const block = new Commands.CommandBlock([], [new Commands.SysCall(cosFun)]);
|
|
@@ -86,17 +81,16 @@ export function createCosFun () {
|
|
|
export function createTanFun () {
|
|
|
const tanFun = (sto, _) => {
|
|
|
const x = sto.applyStore('x');
|
|
|
- const angle = x.value.mod(360);
|
|
|
+ const angle = x.get().mod(360);
|
|
|
if(angle.eq(90) || angle.eq(270)) {
|
|
|
- return Promise.reject("Tangent of "+x.value.toNumber()+"° is undefined.");
|
|
|
+ // TODO better error message
|
|
|
+ return Promise.reject("Tangent of "+x.get().toNumber()+"° is undefined.");
|
|
|
}
|
|
|
- let result = Decimal.tan(convertToRadians(angle));
|
|
|
- // if(result.dp() > Config.decimalPlaces) {
|
|
|
- // result = new Decimal(result.toFixed(Config.decimalPlaces));
|
|
|
- // }
|
|
|
- const temp = new StoreObject(Types.REAL, result);
|
|
|
+ const result = Decimal.tan(convertToRadians(angle));
|
|
|
+ const temp = new StoreValue(Types.REAL, result);
|
|
|
+ sto.insertStore("$", temp);
|
|
|
sto.mode = Modes.RETURN;
|
|
|
- return Promise.resolve(sto.updateStore('$', temp));
|
|
|
+ return Promise.resolve(sto);
|
|
|
};
|
|
|
|
|
|
const block = new Commands.CommandBlock([], [new Commands.SysCall(tanFun)]);
|
|
@@ -109,13 +103,11 @@ export function createTanFun () {
|
|
|
export function createSqrtFun () {
|
|
|
const sqrtFun = (sto, _) => {
|
|
|
const x = sto.applyStore('x');
|
|
|
- let result = x.value.sqrt();
|
|
|
- // if(result.dp() > Config.decimalPlaces) {
|
|
|
- // result = new Decimal(result.toFixed(Config.decimalPlaces));
|
|
|
- // }
|
|
|
- const temp = new StoreObject(Types.REAL, result);
|
|
|
+ const result = x.get().sqrt();
|
|
|
+ const temp = new StoreValue(Types.REAL, result);
|
|
|
+ sto.insertStore("$", temp);
|
|
|
sto.mode = Modes.RETURN;
|
|
|
- return Promise.resolve(sto.updateStore('$', temp));
|
|
|
+ return Promise.resolve(sto);
|
|
|
};
|
|
|
|
|
|
const block = new Commands.CommandBlock([], [new Commands.SysCall(sqrtFun)]);
|
|
@@ -129,13 +121,11 @@ export function createPowFun () {
|
|
|
const powFun = (sto, _) => {
|
|
|
const x = sto.applyStore('x');
|
|
|
const y = sto.applyStore('y');
|
|
|
- let result = x.value.pow(y.value);
|
|
|
- // if(result.dp() > Config.decimalPlaces) {
|
|
|
- // result = new Decimal(result.toFixed(Config.decimalPlaces));
|
|
|
- // }
|
|
|
- const temp = new StoreObject(Types.REAL, result);
|
|
|
+ const result = x.get().pow(y.get());
|
|
|
+ const temp = new StoreValue(Types.REAL, result);
|
|
|
+ sto.insertStore("$", temp);
|
|
|
sto.mode = Modes.RETURN;
|
|
|
- return Promise.resolve(sto.updateStore('$', temp));
|
|
|
+ return Promise.resolve(sto);
|
|
|
};
|
|
|
|
|
|
const block = new Commands.CommandBlock([], [new Commands.SysCall(powFun)]);
|
|
@@ -149,16 +139,15 @@ export function createPowFun () {
|
|
|
export function createLogFun () {
|
|
|
const logFun = (sto, _) => {
|
|
|
const x = sto.applyStore('x');
|
|
|
- if (x.value.isNegative()) {
|
|
|
+ if (x.get().isNegative()) {
|
|
|
+ // TODO better error message
|
|
|
return Promise.reject(new Error("the value passed to log function cannot be negative"));
|
|
|
}
|
|
|
- let result = Decimal.log10(x.value);
|
|
|
- // if(result.dp() > Config.decimalPlaces) {
|
|
|
- // result = new Decimal(result.toFixed(Config.decimalPlaces));
|
|
|
- // }
|
|
|
- const temp = new StoreObject(Types.REAL, result);
|
|
|
+ const result = Decimal.log10(x.get());
|
|
|
+ const temp = new StoreValue(Types.REAL, result);
|
|
|
+ sto.insertStore("$", temp);
|
|
|
sto.mode = Modes.RETURN;
|
|
|
- return Promise.resolve(sto.updateStore('$', temp));
|
|
|
+ return Promise.resolve(sto);
|
|
|
};
|
|
|
|
|
|
const block = new Commands.CommandBlock([], [new Commands.SysCall(logFun)]);
|
|
@@ -171,9 +160,9 @@ export function createLogFun () {
|
|
|
export function createAbsFun () {
|
|
|
const absFun = (sto, _) => {
|
|
|
const x = sto.applyStore('x');
|
|
|
- const result = x.value.abs();
|
|
|
- const temp = new StoreObject(x.type, result);
|
|
|
- sto.updateStore('$', temp)
|
|
|
+ const result = x.get().abs();
|
|
|
+ const temp = new StoreValue(x.type, result);
|
|
|
+ sto.insertStore("$", temp);
|
|
|
sto.mode = Modes.RETURN;
|
|
|
return Promise.resolve(sto);
|
|
|
};
|
|
@@ -188,10 +177,11 @@ export function createAbsFun () {
|
|
|
export function createNegateFun () {
|
|
|
const negateFun = (sto, _) => {
|
|
|
const x = sto.applyStore('x');
|
|
|
- const result = x.value.negated();
|
|
|
- const temp = new StoreObject(x.type, result);
|
|
|
+ const result = x.get().negated();
|
|
|
+ const temp = new StoreValue(x.type, result);
|
|
|
+ sto.insertStore("$", temp);
|
|
|
sto.mode = Modes.RETURN;
|
|
|
- return Promise.resolve(sto.updateStore('$', temp));
|
|
|
+ return Promise.resolve(sto);
|
|
|
};
|
|
|
|
|
|
const block = new Commands.CommandBlock([], [new Commands.SysCall(negateFun)]);
|
|
@@ -204,13 +194,11 @@ export function createNegateFun () {
|
|
|
export function createInvertFun () {
|
|
|
const invertFun = (sto, _) => {
|
|
|
const x = sto.applyStore('x');
|
|
|
- let result = toReal(1).dividedBy(x.value);
|
|
|
- // if(result.dp() > Config.decimalPlaces) {
|
|
|
- // result = new Decimal(result.toFixed(Config.decimalPlaces));
|
|
|
- // }
|
|
|
- const temp = new StoreObject(Types.REAL, result);
|
|
|
+ const result = toReal(1).dividedBy(x.get());
|
|
|
+ const temp = new StoreValue(Types.REAL, result);
|
|
|
+ sto.insertStore("$", temp);
|
|
|
sto.mode = Modes.RETURN;
|
|
|
- return Promise.resolve(sto.updateStore('$', temp));
|
|
|
+ return Promise.resolve(sto);
|
|
|
};
|
|
|
|
|
|
const block = new Commands.CommandBlock([], [new Commands.SysCall(invertFun)]);
|
|
@@ -223,11 +211,12 @@ export function createInvertFun () {
|
|
|
export function createMaxFun () {
|
|
|
const maxFun = (sto, _) => {
|
|
|
const x = sto.applyStore('x');
|
|
|
- const numbers = x.value.map(stoObj => stoObj.value);
|
|
|
+ const numbers = x.get().map(sto_addrs => sto_addrs.get());
|
|
|
const result = Decimal.max(...numbers);
|
|
|
- const temp = new StoreObject(x.type.innerType, result);
|
|
|
+ const temp = new StoreValue(x.type.innerType, result);
|
|
|
+ sto.insertStore("$", temp);
|
|
|
sto.mode = Modes.RETURN;
|
|
|
- return Promise.resolve(sto.updateStore('$', temp));
|
|
|
+ return Promise.resolve(sto);
|
|
|
};
|
|
|
const paramType = new ArrayType(new MultiType([Types.INTEGER, Types.REAL]), 1);
|
|
|
const block = new Commands.CommandBlock([], [new Commands.SysCall(maxFun)]);
|
|
@@ -240,11 +229,12 @@ export function createMaxFun () {
|
|
|
export function createMinFun () {
|
|
|
const minFun = (sto, _) => {
|
|
|
const x = sto.applyStore('x');
|
|
|
- const numbers = x.value.map(stoObj => stoObj.value);
|
|
|
+ const numbers = x.get().map(sto_addrs => sto_addrs.get());
|
|
|
const result = Decimal.min(...numbers);
|
|
|
- const temp = new StoreObject(x.type.innerType, result);
|
|
|
+ const temp = new StoreValue(x.type.innerType, result);
|
|
|
+ sto.insertStore("$", temp);
|
|
|
sto.mode = Modes.RETURN;
|
|
|
- return Promise.resolve(sto.updateStore('$', temp));
|
|
|
+ return Promise.resolve(sto);
|
|
|
};
|
|
|
const paramType = new ArrayType(new MultiType([Types.INTEGER, Types.REAL]), 1);
|
|
|
const block = new Commands.CommandBlock([], [new Commands.SysCall(minFun)]);
|
|
@@ -257,9 +247,10 @@ export function createMinFun () {
|
|
|
export function createRandFun () {
|
|
|
const randFun = (sto, _) => {
|
|
|
const val = Math.random();
|
|
|
- const result = new StoreObject(Types.REAL, new Decimal(val));
|
|
|
+ const temp = new StoreValue(Types.REAL, new Decimal(val));
|
|
|
+ sto.insertStore("$", temp);
|
|
|
sto.mode = Modes.RETURN;
|
|
|
- return Promise.resolve(sto.updateStore("$", result));
|
|
|
+ return Promise.resolve(sto);
|
|
|
};
|
|
|
const block = new Commands.CommandBlock([], [new Commands.SysCall(randFun)]);
|
|
|
const func = new Commands.Function('$rand', Types.REAL, [], block);
|