diff --git a/makefile b/makefile index 80b0210..40a1c25 100644 --- a/makefile +++ b/makefile @@ -170,7 +170,7 @@ test:nasal @ ./nasal -d test/life.nas @ ./nasal -t test/loop.nas @ ./nasal -t test/mandelbrot.nas - @ ./nasal -t test/md5.nas + @ ./nasal -t test/md5_self.nas @ ./nasal -t -d test/md5compare.nas @ ./nasal -d test/module_test.nas @ ./nasal -e test/nasal_test.nas diff --git a/module/libkey.nas b/module/libkey.nas index 9079108..d692c57 100644 --- a/module/libkey.nas +++ b/module/libkey.nas @@ -1,12 +1,10 @@ -var libkey=func(){ - var lib=dylib.dlopen("libkey"~(os.platform()=="windows"?".dll":".so")); - var kb=lib.nas_kbhit; - var gt=lib.nas_getch; - var nb=lib.nas_noblock; - var call=dylib.limitcall(0); - return { - kbhit:func(){return call(kb);}, - getch:func(){return call(gt);}, - nonblock:func(){return call(nb);} - } -}(); \ No newline at end of file + +var lib=dylib.dlopen("libkey"~(os.platform()=="windows"?".dll":".so")); +var kb=lib.nas_kbhit; +var gt=lib.nas_getch; +var nb=lib.nas_noblock; +var call=dylib.limitcall(0); + +var kbhit = func(){return call(kb);} +var getch = func(){return call(gt);} +var nonblock = func(){return call(nb);} diff --git a/module/libmat.nas b/module/libmat.nas index 64a1cbd..fe7cfa5 100644 --- a/module/libmat.nas +++ b/module/libmat.nas @@ -1,62 +1,61 @@ -var libmat=func(){ - var dl=dylib.dlopen("libmat."~(os.platform()=="windows"?"dll":"so")); - var vec2=dl.nas_vec2; - var vec3=dl.nas_vec3; - var (vec2add,vec2sub,vec2mul,vec2div,vec2neg,vec2norm,vec2len,vec2dot)=( - dl.nas_vec2_add, - dl.nas_vec2_sub, - dl.nas_vec2_mult, - dl.nas_vec2_div, - dl.nas_vec2_neg, - dl.nas_vec2_norm, - dl.nas_vec2_len, - dl.nas_vec2_dot - ); - var (vec3add,vec3sub,vec3mul,vec3div,vec3neg,vec3norm,vec3len,vec3dot)=( - dl.nas_vec3_add, - dl.nas_vec3_sub, - dl.nas_vec3_mult, - dl.nas_vec3_div, - dl.nas_vec3_neg, - dl.nas_vec3_norm, - dl.nas_vec3_len, - dl.nas_vec3_dot - ); - var (rotate_x,rotate_y,rotate_z)=( - dl.nas_rotate_x, - dl.nas_rotate_y, - dl.nas_rotate_z - ); - var (invoke_i,invoke_ii,invoke_iii)=( - dylib.limitcall(1), - dylib.limitcall(2), - dylib.limitcall(3) - ); - return { - vec2:{ - new: func(x,y){return invoke_ii(vec2,x,y);}, - add: func(v0,v1){return invoke_ii(vec2add,v0,v1);}, - sub: func(v0,v1){return invoke_ii(vec2sub,v0,v1);}, - mul: func(v0,v1){return invoke_ii(vec2mul,v0,v1);}, - div: func(v0,v1){return invoke_ii(vec2div,v0,v1);}, - neg: func(v0){return invoke_i(vec2neg,v0);}, - norm: func(v0){return invoke_i(vec2norm,v0);}, - len: func(v0){return invoke_i(vec2len,v0);}, - dot: func(v0,v1){return invoke_ii(vec2dot,v0,v1);} - }, - vec3:{ - new: func(x,y,z){return invoke_iii(vec3,x,y,z);}, - add: func(v0,v1){return invoke_ii(vec3add,v0,v1);}, - sub: func(v0,v1){return invoke_ii(vec3sub,v0,v1);}, - mul: func(v0,v1){return invoke_ii(vec3mul,v0,v1);}, - div: func(v0,v1){return invoke_ii(vec3div,v0,v1);}, - neg: func(v0){return invoke_i(vec3neg,v0);}, - norm: func(v0){return invoke_i(vec3norm,v0);}, - len: func(v0){return invoke_i(vec3len,v0);}, - rx: func(v0,angle){return invoke_ii(rotate_x,v0,angle);}, - ry: func(v0,angle){return invoke_ii(rotate_y,v0,angle);}, - rz: func(v0,angle){return invoke_ii(rotate_z,v0,angle);}, - dot: func(v0,v1){return invoke_ii(vec3dot,v0,v1);} - } - }; -}(); \ No newline at end of file + +var dl=dylib.dlopen("libmat."~(os.platform()=="windows"?"dll":"so")); +var vec2=dl.nas_vec2; +var vec3=dl.nas_vec3; +var (vec2add,vec2sub,vec2mul,vec2div,vec2neg,vec2norm,vec2len,vec2dot)=( + dl.nas_vec2_add, + dl.nas_vec2_sub, + dl.nas_vec2_mult, + dl.nas_vec2_div, + dl.nas_vec2_neg, + dl.nas_vec2_norm, + dl.nas_vec2_len, + dl.nas_vec2_dot +); +var (vec3add,vec3sub,vec3mul,vec3div,vec3neg,vec3norm,vec3len,vec3dot)=( + dl.nas_vec3_add, + dl.nas_vec3_sub, + dl.nas_vec3_mult, + dl.nas_vec3_div, + dl.nas_vec3_neg, + dl.nas_vec3_norm, + dl.nas_vec3_len, + dl.nas_vec3_dot +); +var (rotate_x,rotate_y,rotate_z)=( + dl.nas_rotate_x, + dl.nas_rotate_y, + dl.nas_rotate_z +); +var (invoke_i,invoke_ii,invoke_iii)=( + dylib.limitcall(1), + dylib.limitcall(2), + dylib.limitcall(3) +); + +var vec2={ + new: func(x,y){return invoke_ii(vec2,x,y);}, + add: func(v0,v1){return invoke_ii(vec2add,v0,v1);}, + sub: func(v0,v1){return invoke_ii(vec2sub,v0,v1);}, + mul: func(v0,v1){return invoke_ii(vec2mul,v0,v1);}, + div: func(v0,v1){return invoke_ii(vec2div,v0,v1);}, + neg: func(v0){return invoke_i(vec2neg,v0);}, + norm: func(v0){return invoke_i(vec2norm,v0);}, + len: func(v0){return invoke_i(vec2len,v0);}, + dot: func(v0,v1){return invoke_ii(vec2dot,v0,v1);} +}; +var vec3={ + new: func(x,y,z){return invoke_iii(vec3,x,y,z);}, + add: func(v0,v1){return invoke_ii(vec3add,v0,v1);}, + sub: func(v0,v1){return invoke_ii(vec3sub,v0,v1);}, + mul: func(v0,v1){return invoke_ii(vec3mul,v0,v1);}, + div: func(v0,v1){return invoke_ii(vec3div,v0,v1);}, + neg: func(v0){return invoke_i(vec3neg,v0);}, + norm: func(v0){return invoke_i(vec3norm,v0);}, + len: func(v0){return invoke_i(vec3len,v0);}, + rx: func(v0,angle){return invoke_ii(rotate_x,v0,angle);}, + ry: func(v0,angle){return invoke_ii(rotate_y,v0,angle);}, + rz: func(v0,angle){return invoke_ii(rotate_z,v0,angle);}, + dot: func(v0,v1){return invoke_ii(vec3dot,v0,v1);} +}; + diff --git a/src/nasal_import.cpp b/src/nasal_import.cpp index 9a3ff95..f756706 100644 --- a/src/nasal_import.cpp +++ b/src/nasal_import.cpp @@ -1,4 +1,5 @@ #include "nasal_import.h" +#include "symbol_finder.h" linker::linker(): show_path(false), lib_loaded(false), @@ -203,6 +204,55 @@ code_block* linker::import_nasal_lib() { return load(tmp, files.size()-1); } +std::string linker::generate_module_name(const std::string& filename) { + auto error_name = "error_generated@[" + filename + "]"; + auto pos = filename.find_last_of(".nas"); + if (pos==std::string::npos) { + return error_name; + } + pos -= 4; + auto split_pos = filename.find_last_of("/"); + if (split_pos==std::string::npos) { + split_pos = filename.find_last_of("\\"); + } + if (split_pos==std::string::npos) { + return error_name; + } + return filename.substr(split_pos + 1, pos - split_pos); +} + +return_expr* linker::generate_module_return(code_block* block) { + auto sf = new symbol_finder; + auto res = new return_expr(block->get_location()); + auto value = new hash_expr(block->get_location()); + res->set_value(value); + for(const auto& i : sf->do_find(block)) { + auto pair = new hash_pair(block->get_location()); + pair->set_name(i.name); + pair->set_value(new identifier(block->get_location(), i.name)); + value->add_member(pair); + } + delete sf; + return res; +} + +definition_expr* linker::generate_module_definition(code_block* block) { + auto def = new definition_expr(block->get_location()); + def->set_identifier(new identifier( + block->get_location(), + generate_module_name(block->get_location().file))); + + auto call = new call_expr(block->get_location()); + auto func = new function(block->get_location()); + func->set_code_block(block); + func->get_code_block()->add_expression(generate_module_return(block)); + call->set_first(func); + call->add_call(new call_function(block->get_location())); + + def->set_value(call); + return def; +} + code_block* linker::load(code_block* root, u16 fileindex) { auto tree = new code_block({0, 0, 0, 0, files[fileindex]}); if (!lib_loaded) { @@ -216,8 +266,9 @@ code_block* linker::load(code_block* root, u16 fileindex) { break; } auto tmp = import_regular_file((call_expr*)i); - link(tree, tmp); - delete tmp; + tree->add_expression(generate_module_definition(tmp)); + // link(tree, tmp); + // delete tmp; } // add root to the back of tree auto file_head = new file_info( @@ -239,10 +290,5 @@ const error& linker::link( auto new_tree_root = load(parse.tree(), 0); auto old_tree_root = parse.swap(new_tree_root); delete old_tree_root; - if (show_path) { - std::clog << orange << "Linker Info" << reset << ":\n"; - std::clog << " compiled file: <" << this_file << ">\n"; - std::clog << " library path : <" << lib_path << ">\n\n"; - } return err; } diff --git a/src/nasal_import.h b/src/nasal_import.h index dd3c1c5..f06bf8d 100644 --- a/src/nasal_import.h +++ b/src/nasal_import.h @@ -16,6 +16,9 @@ #include "nasal_ast.h" #include "nasal_lexer.h" #include "nasal_parse.h" +#include "symbol_finder.h" + +#include class linker{ private: @@ -34,9 +37,15 @@ private: std::string find_file(const std::string&, const span&); code_block* import_regular_file(call_expr*); code_block* import_nasal_lib(); + std::string generate_module_name(const std::string&); + return_expr* generate_module_return(code_block*); + definition_expr* generate_module_definition(code_block*); code_block* load(code_block*, u16); + public: linker(); const error& link(parse&, const std::string&, bool); const std::vector& filelist() const {return files;} + const std::string& get_this_file() const {return this_file;} + const std::string& get_lib_path() const {return lib_path;} }; diff --git a/std/process_bar.nas b/std/process_bar.nas index 1a846dc..ae05498 100644 --- a/std/process_bar.nas +++ b/std/process_bar.nas @@ -2,13 +2,7 @@ # ValKmjolnir 2022/6/14 # this file is inspired by a Python lib: alive_progress -var process_bar={ - bar:nil, - high_resolution_bar:nil, - spinner:nil -}; - -process_bar.bar=func(){ +var bar=func(){ var bar={ solid_triangle_right:"▶", hollow_triangle_right:"▷", @@ -73,7 +67,7 @@ process_bar.bar=func(){ # unix.sleep(0.001); # } # println(); -process_bar.high_resolution_bar=func(){ +var high_resolution_bar=func(){ var block=["▏","▎","▍","▌","▋","▊","▉","█"]; return func(length){ return { @@ -103,7 +97,7 @@ process_bar.high_resolution_bar=func(){ }; }(); -process_bar.spinner=func(){ +var spinner=func(){ var generate_scrolling_spinner=func(s){ if(typeof(s)!="str") s="****"; @@ -241,7 +235,8 @@ process_bar.spinner=func(){ } }; }(); -process_bar.default_bar=func(name="classic",length=20){ + +var default_bar=func(name="classic",length=20){ if(typeof(name)!="str") name="classic"; if(name=="classic") @@ -267,7 +262,8 @@ process_bar.default_bar=func(name="classic",length=20){ else return process_bar.bar("sharp","point","bracket",length); } -process_bar.default_spinner=func(name="classic",repeat=1){ + +var default_spinner=func(name="classic",repeat=1){ if(typeof(name)!="str") name="classic"; if(name=="rise") diff --git a/std/queue.nas b/std/queue.nas index c455e26..1c98f84 100644 --- a/std/queue.nas +++ b/std/queue.nas @@ -1,6 +1,6 @@ # queue.nas # valkmjolnir 2021/3/31 -var queue=func(){ +var new=func(){ var (begin,end)=(nil,nil); return{ push:func(elem){ diff --git a/test/ascii-art.nas b/test/ascii-art.nas index 08c29fd..eec4b6e 100644 --- a/test/ascii-art.nas +++ b/test/ascii-art.nas @@ -1,6 +1,8 @@ import.std.padding; import.std.process_bar; +var (leftpad, rightpad) = (padding.leftpad, padding.rightpad); + var char_ttf=[ [" "," "," "," "," "," "], [" █████╗ ","██╔══██╗","███████║","██╔══██║","██║ ██║","╚═╝ ╚═╝"], diff --git a/test/auto_crash.nas b/test/auto_crash.nas index cd5dce7..ce77221 100644 --- a/test/auto_crash.nas +++ b/test/auto_crash.nas @@ -1,6 +1,12 @@ # Road check and auto pilot by ValKmjolnir import.std.fg_env; +var props = fg_env.props; +var geodinfo = fg_env.geodinfo; +var maketimer = fg_env.maketimer; +var D2R = fg_env.D2R; +var simulation = fg_env.simulation; + var dt=0.01; var intergral=0; var derivative=0; diff --git a/test/bfs.nas b/test/bfs.nas index dffce5b..4568d6b 100644 --- a/test/bfs.nas +++ b/test/bfs.nas @@ -24,7 +24,7 @@ var prt=func(){ var bfs=func(begin,end){ var move=[[1,0],[0,1],[-1,0],[0,-1]]; - var que=queue(); + var que=queue.new(); que.push(begin); map[begin[0]][begin[1]]=2; map[end[0]][end[1]]=0; diff --git a/test/bp.nas b/test/bp.nas index 1218a2d..f685a68 100644 --- a/test/bp.nas +++ b/test/bp.nas @@ -127,4 +127,4 @@ foreach(var v;training_set){ print(v,': ',output[0].out,'\n'); } -bp_example(); \ No newline at end of file +mat.bp_example(); \ No newline at end of file diff --git a/test/calc.nas b/test/calc.nas index 6103183..b6a5cb1 100644 --- a/test/calc.nas +++ b/test/calc.nas @@ -2,16 +2,20 @@ import.std.padding; import.std.file; import.std.sort; -var source=find_all_files_with_extension("./src","cpp","h"); +var sort = sort.sort; + +var (leftpad, rightpad) = (padding.leftpad, padding.rightpad); + +var source=file.find_all_files_with_extension("./src","cpp","h"); sort(source,func(a,b){return cmp(a,b)<0}); -var lib=find_all_files_with_extension("./std","nas"); +var lib=file.find_all_files_with_extension("./std","nas"); sort(lib,func(a,b){return cmp(a,b)<0}); -var testfile=find_all_files_with_extension("./test","nas"); +var testfile=file.find_all_files_with_extension("./test","nas"); sort(testfile,func(a,b){return cmp(a,b)<0}); -var module=find_all_files_with_extension("./module","cpp","nas"); +var module=file.find_all_files_with_extension("./module","cpp","nas"); sort(module,func(a,b){return cmp(a,b)<0}); var longest=func(vec...){ diff --git a/test/coroutine.nas b/test/coroutine.nas index 0e2e8b9..0bcb539 100644 --- a/test/coroutine.nas +++ b/test/coroutine.nas @@ -3,6 +3,8 @@ import.std.process_bar; import.std.padding; +var (leftpad, rightpad) = (padding.leftpad, padding.rightpad); + if(os.platform()=="windows"){ system("chcp 65001"); system("color"); diff --git a/test/datalog.nas b/test/datalog.nas index 31af9ea..6b0fc5d 100644 --- a/test/datalog.nas +++ b/test/datalog.nas @@ -2,6 +2,9 @@ import.std.sort; import.std.padding; import.std.process_bar; +var sort = sort.sort; +var (leftpad, rightpad) = (padding.leftpad, padding.rightpad); + var mess=func(vec) { srand(); var s=size(vec); diff --git a/test/hexdump.nas b/test/hexdump.nas index f4a4181..fd3cd49 100644 --- a/test/hexdump.nas +++ b/test/hexdump.nas @@ -21,7 +21,7 @@ var hex=func(){ # read file var s=func(){ - var filename = find_all_files_with_extension("./src","cpp","h"); + var filename = file.find_all_files_with_extension("./src","cpp","h"); if(size(runtime.argv())!=0){ var argv=runtime.argv(); if(argv[0]=="-h" or argv[0]=="--h"){ diff --git a/test/httptest.nas b/test/httptest.nas index d471e5a..2fac7f8 100644 --- a/test/httptest.nas +++ b/test/httptest.nas @@ -1,5 +1,7 @@ import.module.libsock; +var socket = libsock.socket; + var http=func(){ var sd=nil; return { diff --git a/test/json.nas b/test/json.nas index 5355d92..fd04cdd 100644 --- a/test/json.nas +++ b/test/json.nas @@ -1,6 +1,8 @@ import.std.json; import.std.process_bar; +var JSON = json.JSON; + var ss=JSON.stringify({ vec:[0,1,2], hash:{ diff --git a/test/jsonrpc.nas b/test/jsonrpc.nas index 37ef20e..f3e78f9 100644 --- a/test/jsonrpc.nas +++ b/test/jsonrpc.nas @@ -1,6 +1,9 @@ import.module.libsock; import.std.json; +var JSON = json.JSON; +var socket = libsock.socket; + var gettime=func(){ return split(" ",os.time())[1]; } diff --git a/test/md5.nas b/test/md5_self.nas similarity index 100% rename from test/md5.nas rename to test/md5_self.nas diff --git a/test/md5compare.nas b/test/md5compare.nas index 1cb6ebc..060cbae 100644 --- a/test/md5compare.nas +++ b/test/md5compare.nas @@ -1,8 +1,10 @@ -import.test.md5; +import.test.md5_self; import.std.process_bar; import.std.file; srand(); +var _md5 = md5_self._md5; + var compare=func() { var ch=[ "0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","+", @@ -45,22 +47,22 @@ var compare=func() { var filechecksum=func(){ var files=[]; - foreach(var p;find_all_files_with_extension("./test","nas")) { + foreach(var p;file.find_all_files_with_extension("./test","nas")) { append(files,"./test/"~p); } - foreach(var p;find_all_files_with_extension("./std","nas")) { + foreach(var p;file.find_all_files_with_extension("./std","nas")) { append(files,"./std/"~p); } - foreach(var p;find_all_files_with_extension("./module","nas","cpp")) { + foreach(var p;file.find_all_files_with_extension("./module","nas","cpp")) { append(files,"./module/"~p); } - foreach(var p;find_all_files_with_extension(".","md")) { + foreach(var p;file.find_all_files_with_extension(".","md")) { append(files,"./"~p); } - foreach(var p;find_all_files_with_extension("./src","cpp","h")) { + foreach(var p;file.find_all_files_with_extension("./src","cpp","h")) { append(files,"./src/"~p); } - foreach(var p;find_all_files_with_extension("./doc","md")) { + foreach(var p;file.find_all_files_with_extension("./doc","md")) { append(files,"./doc/"~p); } diff --git a/test/quick_sort.nas b/test/quick_sort.nas index aefd196..53ce809 100644 --- a/test/quick_sort.nas +++ b/test/quick_sort.nas @@ -1,5 +1,9 @@ import.std.sort; +var var_sort = sort.var_sort; +var sort = sort.sort; + + var vec=[]; setsize(vec, 1e4); rand(time(0)); diff --git a/test/word_collector.nas b/test/word_collector.nas index 23efb73..1a917fb 100644 --- a/test/word_collector.nas +++ b/test/word_collector.nas @@ -1,4 +1,5 @@ import.std.sort; +var sort = sort.sort; var to_lower=func(s){ var tmp=""; diff --git a/tools/andy_gc_test.nas b/tools/andy_gc_test.nas new file mode 100644 index 0000000..6960304 --- /dev/null +++ b/tools/andy_gc_test.nas @@ -0,0 +1,95 @@ + +var REPS = 10; +var COUNT = 16384; + +print("Initializing...\n"); +var v = []; +for(var i=0; i