UNPKG

force-lang

Version:

a modern forth lang compatible with NodeJS

117 lines (102 loc) 2.32 kB
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;