force-lang
Version:
a modern forth lang compatible with NodeJS
117 lines (102 loc) • 2.32 kB
JavaScript
import log from 'bunny-logger';
import obj_utils from './obj_utils.js';
class Stack {
constructor() {
this._stack = [];
this._rstack = [];
}
cloneJS(e) {
return typeof e === 'object' ? JSON.parse(JSON.stringify(e)) : e;
}
push(e) {
this._stack.unshift(e);
}
pop() {
return this._stack.shift();
}
rpush(e) {
this._rstack.unshift(e);
}
rpop() {
return this._rstack.shift();
}
peek() {
// if(this._stack[0]?._type === 'TC_FUNC_JS') {
// return this._stack[0];
// }
// if(this._stack[0]?._type==='TC_JSON') {
// return this._stack[0];
// }
// //return this.cloneJS(this._stack[0]);
return this._stack[0];
}
rpeek() {
return this._rstack[0];
}
look_at(i) {
// return this.cloneJS(this._stack[i]);
return this._stack[i];
}
get_list() {
return this._stack;
}
item_to_str(item) {
let str = '{';
str += item._type;
if (item._name) {
str += ` ${item._name}`;
}
try {
switch (item._type) {
case 'TC_NUM':
case 'TC_STR':
case 'TC_BOOL':
str += ` ${item._datum}`;
break;
case 'TC_VAR':
if (item._datum._type == 'TC_JSON') {
str += ` ${obj_utils.stringify(item._datum._datum)}`;
} else {
str += ` ${item._datum._datum}`;
}
break;
case 'TC_JSON':
str += ` ${obj_utils.stringify(item._datum)}`;
break;
case 'TC_FUNC_JS':
str += ` ${obj_utils.stringify(item._datum)}`;
break;
case 'TC_LAMBDA_FUNC':
str += ' '; // + JSON.stringify(item._datum._datum);
break;
case 'TC_ERR':
str += ` ${JSON.stringify(item._datum)}`;
break;
case 'TC_PROMISE':
str += ` ${item._datum}`;
break;
default:
break;
}
} catch (e) {
str += ' ... ';
}
str += '}';
return str;
}
print() {
let pos = 1;
if (this._stack.length == 0) {
log.info('(empty)');
return;
}
for (const item of this._stack) {
log.info(`${pos}: ${this.item_to_str(item)}`);
pos++;
}
}
print_debug() {
log.info(this._stack);
}
}
export default Stack;