UNPKG

force-lang

Version:

a modern forth lang compatible with NodeJS

164 lines (158 loc) 3.12 kB
const log = require('bunny-logger'); const Stack = require('./stack'); class dict_obj{ constructor(){ this._type = null; this._name = null; this._datum = null; this._where = null; } } class Env{ constructor(){ this._use_ns = false; this._dict = []; this._dict_ns = {}; this.s = new Stack(); } print_stack(){ this.s.print(); } TOS(){ return this.s.peek(); } TOS2(){ return this.s.look_at(1); } is_bool(e){ if(e && e._type=='TC_BOOL') return true; return false; } is_true(e){ if(e && e._type=='TC_BOOL' && e._datum=='T') return true; return false; } is_false(e){ if(e && e._type=='TC_BOOL' && e._datum=='F') return true; return false; } is_num(e){ if(e && e._type=='TC_NUM') return true; return false; } is_string(e){ if(e && e._type=='TC_STR') return true; return false; } is_json(e){ if(e && e._type=='TC_JSON') return true; return false; } is_obj(e){ if(e && e._type=='TC_JSON' && !this.is_list(e)) return true; return false; } is_list(e){ if(e && e._type=='TC_JSON' && e._datum instanceof Array) return true; return false; } true_obj(){ return {"_type":"TC_BOOL","_datum": 'T'}; } false_obj(){ return {"_type":"TC_BOOL","_datum": 'F'}; } adj_bool_val(e){ if(e===true) return 'T'; if(e===false) return 'F'; return e; } guess_type(e){ switch(typeof(e)){ case 'number': return 'TC_NUM'; break; case 'string': return 'TC_STR'; break; case 'object': if(e instanceof Promise) return 'TC_PROMISE'; return 'TC_JSON'; break; case 'boolean': return 'TC_BOOL'; break; case 'function': return 'TC_FUNC_JS'; break; default: return 'TC_UNDEF'; break; } } get_bool_val(e){ if(this.is_bool(e)){ if(this.is_true(e)) return true; if(this.is_false(e)) return false; } } set_bool_val(e){ if(e===true) return this.true_obj(); if(e===false) return this.false_obj(); } lookup_ns(name){ } lookup_norm(name, type){ for(var item of this._dict){ //if(type && item._type == type) if(item._name == name) return item; } return false; } lookup(name, type){ return this.lookup_norm(name, type); } delete_norm(name){ let index = this._dict.map(function(e) { return e._name; }).indexOf(name); //log.info(index); //log.info(this._dict[index]); if(index >= 0) { this._dict.splice(index,1); } else { throw("word not found."); } } delete(name){ return this.delete_norm(name); } set_ns(name, val){ } set_norm(name, val, type, where){ var x; if(x=this.lookup(name)){ x._datum = val; }else{ this.add_norm(name, val, type, where); } } add_norm(name, val, type, where){ var x; x=new dict_obj(); x._type = type; x._name = name; x._datum = val; x._where = where; this._dict.unshift(x); } set(name, val, type, where){ this.add_norm(name, val, type, where); //this.set_norm(name, val, type, where); } print_debug(){ //log.info(this._dict); this._dict.forEach(item => { log.info(`${item._type} ${item._name} ${item._datum._type}`); }); } }; module.exports = new Env();