From 7f8a0b64457652b781c7b032102871e54f8f774c Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Fri, 20 Oct 2023 00:24:17 +0800 Subject: [PATCH] :sparkles: improve code & add new test file --- src/nasal.h | 3 +-- src/nasal_type.cpp | 16 ++++++++-------- src/nasal_type.h | 27 +++++++++++---------------- src/nasal_vm.h | 28 ++++++++++++++-------------- std/result.nas | 23 ++++++++++++----------- test/ascii-art.nas | 1 - test/flush_screen.nas | 28 ++++++++++++++++++++++++++++ 7 files changed, 74 insertions(+), 52 deletions(-) create mode 100644 test/flush_screen.nas diff --git a/src/nasal.h b/src/nasal.h index 6ad8084..5b6b104 100644 --- a/src/nasal.h +++ b/src/nasal.h @@ -35,8 +35,7 @@ bool is_powerpc(); bool is_superh(); -// virtual machine stack depth -// both global depth and value stack depth +// virtual machine stack depth, both global depth and value stack depth const u32 STACK_DEPTH = 4096; f64 hex2f(const char*); diff --git a/src/nasal_type.cpp b/src/nasal_type.cpp index f3fe65e..15a6993 100644 --- a/src/nasal_type.cpp +++ b/src/nasal_type.cpp @@ -2,7 +2,7 @@ namespace nasal { -var nas_vec::get_val(const i32 n) { +var nas_vec::get_value(const i32 n) { i32 size = elems.size(); if (n<-size || n>=size) { return var::none(); @@ -10,7 +10,7 @@ var nas_vec::get_val(const i32 n) { return elems[n>=0? n:n+size]; } -var* nas_vec::get_mem(const i32 n) { +var* nas_vec::get_memory(const i32 n) { i32 size = elems.size(); if (n<-size || n>=size) { return nullptr; @@ -33,7 +33,7 @@ std::ostream& operator<<(std::ostream& out, nas_vec& vec) { return out; } -var nas_hash::get_val(const std::string& key) { +var nas_hash::get_value(const std::string& key) { if (elems.count(key)) { return elems.at(key); } else if (!elems.count("parents")) { @@ -46,7 +46,7 @@ var nas_hash::get_val(const std::string& key) { } for(auto& i : val.vec().elems) { if (i.type==vm_hash) { - ret = i.hash().get_val(key); + ret = i.hash().get_value(key); } if (ret.type!=vm_none) { return ret; @@ -55,7 +55,7 @@ var nas_hash::get_val(const std::string& key) { return ret; } -var* nas_hash::get_mem(const std::string& key) { +var* nas_hash::get_memory(const std::string& key) { if (elems.count(key)) { return &elems.at(key); } else if (!elems.count("parents")) { @@ -68,7 +68,7 @@ var* nas_hash::get_mem(const std::string& key) { } for(auto& i : val.vec().elems) { if (i.type==vm_hash) { - addr = i.hash().get_mem(key); + addr = i.hash().get_memory(key); } if (addr) { return addr; @@ -160,14 +160,14 @@ std::ostream& operator<<(std::ostream& out, const nas_co& co) { return out; } -var nas_map::get_val(const std::string& key) { +var nas_map::get_value(const std::string& key) { if (mapper.count(key)) { return *mapper.at(key); } return var::none(); } -var* nas_map::get_mem(const std::string& key) { +var* nas_map::get_memory(const std::string& key) { if (mapper.count(key)) { return mapper.at(key); } diff --git a/src/nasal_type.h b/src/nasal_type.h index b4cefdd..37d7cf7 100644 --- a/src/nasal_type.h +++ b/src/nasal_type.h @@ -101,25 +101,23 @@ public: struct nas_vec { std::vector elems; - // mark if this is printed, avoid stackoverflow - bool printed; + // mark if this is printed, avoid stack overflow + bool printed = false; - nas_vec():printed(false) {} usize size() const {return elems.size();} - var get_val(const i32); - var* get_mem(const i32); + var get_value(const i32); + var* get_memory(const i32); }; struct nas_hash { std::unordered_map elems; - // mark if this is printed, avoid stackoverflow - bool printed; + // mark if this is printed, avoid stack overflow + bool printed = false; - nas_hash(): printed(false) {} usize size() const {return elems.size();} - var get_val(const std::string&); - var* get_mem(const std::string&); + var get_value(const std::string&); + var* get_memory(const std::string&); }; struct nas_func { @@ -180,9 +178,7 @@ public: void clear(); public: - const std::string& get_ghost_name() const { - return type_name; - } + const auto& get_ghost_name() const {return type_name;} }; struct context { @@ -220,13 +216,12 @@ struct nas_map { bool printed = false; std::unordered_map mapper; - nas_map() {} void clear() { mapper.clear(); } - var get_val(const std::string&); - var* get_mem(const std::string&); + var get_value(const std::string&); + var* get_memory(const std::string&); }; struct nas_val { diff --git a/src/nasal_vm.h b/src/nasal_vm.h index 8b20630..cb8f985 100644 --- a/src/nasal_vm.h +++ b/src/nasal_vm.h @@ -612,7 +612,7 @@ inline void vm::o_callv() { var val = ctx.top[0]; var vec = (--ctx.top)[0]; if (vec.type==vm_vec) { - ctx.top[0] = vec.vec().get_val(val.to_num()); + ctx.top[0] = vec.vec().get_value(val.to_num()); if (ctx.top[0].type==vm_none) { die(report_out_of_range(val.to_num(), vec.vec().size())); return; @@ -622,7 +622,7 @@ inline void vm::o_callv() { die("must use string as the key but get "+type_name_string(val)); return; } - ctx.top[0] = vec.hash().get_val(val.str()); + ctx.top[0] = vec.hash().get_value(val.str()); if (ctx.top[0].type==vm_none) { die(report_key_not_found(val.str(), vec.hash())); return; @@ -645,7 +645,7 @@ inline void vm::o_callv() { die("must use string as the key but get "+type_name_string(val)); return; } - ctx.top[0] = vec.map().get_val(val.str()); + ctx.top[0] = vec.map().get_value(val.str()); if (ctx.top[0].type==vm_none) { die("cannot find symbol \""+val.str()+"\""); return; @@ -663,7 +663,7 @@ inline void vm::o_callvi() { return; } // cannot use operator[],because this may cause overflow - (++ctx.top)[0] = val.vec().get_val(imm[ctx.pc]); + (++ctx.top)[0] = val.vec().get_value(imm[ctx.pc]); if (ctx.top[0].type==vm_none) { die(report_out_of_range(imm[ctx.pc], val.vec().size())); return; @@ -678,9 +678,9 @@ inline void vm::o_callh() { } const auto& str = const_string[imm[ctx.pc]]; if (val.type==vm_hash) { - ctx.top[0] = val.hash().get_val(str); + ctx.top[0] = val.hash().get_value(str); } else { - ctx.top[0] = val.map().get_val(str); + ctx.top[0] = val.map().get_value(str); } if (ctx.top[0].type==vm_none) { val.type==vm_hash? @@ -854,7 +854,7 @@ inline void vm::o_slcend() { inline void vm::o_slc() { var val = (ctx.top--)[0]; - var res = ctx.top[-1].vec().get_val(val.to_num()); + var res = ctx.top[-1].vec().get_value(val.to_num()); if (res.type==vm_none) { die(report_out_of_range(val.to_num(), ctx.top[-1].vec().size())); return; @@ -923,7 +923,7 @@ inline void vm::o_mcallv() { var val = ctx.top[0]; // index var vec = (--ctx.top)[0]; // mcall vector, reserved on stack to avoid gc if (vec.type==vm_vec) { - ctx.memr = vec.vec().get_mem(val.to_num()); + ctx.memr = vec.vec().get_memory(val.to_num()); if (!ctx.memr) { die(report_out_of_range(val.to_num(), vec.vec().size())); return; @@ -935,10 +935,10 @@ inline void vm::o_mcallv() { } auto& ref = vec.hash(); const auto& str = val.str(); - ctx.memr = ref.get_mem(str); + ctx.memr = ref.get_memory(str); if (!ctx.memr) { ref.elems[str] = nil; - ctx.memr = ref.get_mem(str); + ctx.memr = ref.get_memory(str); } } else if (vec.type==vm_map) { if (val.type!=vm_str) { @@ -947,7 +947,7 @@ inline void vm::o_mcallv() { } auto& ref = vec.map(); const auto& str = val.str(); - ctx.memr = ref.get_mem(str); + ctx.memr = ref.get_memory(str); if (!ctx.memr) { die("cannot find symbol \"" + str + "\""); } @@ -965,18 +965,18 @@ inline void vm::o_mcallh() { } const auto& str = const_string[imm[ctx.pc]]; if (hash.type==vm_map) { - ctx.memr = hash.map().get_mem(str); + ctx.memr = hash.map().get_memory(str); if (!ctx.memr) { die("cannot find symbol \"" + str + "\""); } return; } auto& ref = hash.hash(); - ctx.memr = ref.get_mem(str); + ctx.memr = ref.get_memory(str); // create a new key if (!ctx.memr) { ref.elems[str] = nil; - ctx.memr = ref.get_mem(str); + ctx.memr = ref.get_memory(str); } } diff --git a/std/result.nas b/std/result.nas index 6631b88..e048e52 100644 --- a/std/result.nas +++ b/std/result.nas @@ -1,22 +1,23 @@ # result.nas # ValKmjolnir 2021 -var Result=func(){ - var (ok,err,flag)=(nil,"",1); - return{ - Ok:func(val){ - ok=val; - flag=0; +var new = func() { + var (ok, err, flag) = (nil, "", 1); + return { + Ok: func(val) { + ok = val; + flag = 0; return me; }, - Err:func(info){ - err=info; - flag=1; + Err: func(info) { + err = info; + flag = 1; return me; }, - unwrap:func(){ - if(flag) + unwrap: func() { + if (flag) { die(err); + } return ok; } }; diff --git a/test/ascii-art.nas b/test/ascii-art.nas index 893f944..9e8335f 100644 --- a/test/ascii-art.nas +++ b/test/ascii-art.nas @@ -191,7 +191,6 @@ var ansi_escape_sequence=func(){ } unix.sleep(0.01); } - } # enable unicode diff --git a/test/flush_screen.nas b/test/flush_screen.nas new file mode 100644 index 0000000..18e064d --- /dev/null +++ b/test/flush_screen.nas @@ -0,0 +1,28 @@ +import.module.libkey; + +srand(); + +var chars = "abcdefghijklmnopqrstuvwxyz" ~ + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ~ + "1234567890" ~ + "!@#$%^&*()_+-=~`[]{}\\|'\";:,.<>/?"; +chars = split("", chars); + +print("\ec"); +while(1) { + var key = libkey.nonblock(); + if (key!=nil and chr(key)=="q") { + break; + } + var res = "\e[1;1H"; + for(var i = 0; i<20; i+=1) { + for(var j = 0; j<40; j+=1) { + res ~= "\e[38;5;" ~ int(rand()*256) ~ ";1m"; + res ~= chars[int(rand()*size(chars))]; + res ~= "\e[0m "; + } + res ~= "\n"; + } + print(res); + unix.sleep(1/30); +} \ No newline at end of file