diff --git a/doc/benchmark.md b/doc/benchmark.md index da0f094..6c3d3be 100644 --- a/doc/benchmark.md +++ b/doc/benchmark.md @@ -110,3 +110,15 @@ And we use this bf interpreter to draw a mandelbrot set. In 2022/2/17 update we added `\e` into the lexer. And the `bfcolored.nas` uses this special ASCII code. Here is the result: ![mandelbrot](../doc/pic/mandelbrot.png) + +## More nasal generated pictures + +![mandelbrotset](../doc/pic/mandelbrotset.png) + +![mandelbrotset_reverse](../doc/pic/mandelbrotset_reverse.png) + +![burningship](../doc/pic/burningship.png) + +![burningship_reverse](../doc/pic/burningship_reverse.png) + +![feigenbaum](../doc/pic/feigenbaum.png) diff --git a/doc/nasal-http-test-web.html b/doc/nasal-http-test-web.html index d2c2e83..e452a00 100644 --- a/doc/nasal-http-test-web.html +++ b/doc/nasal-http-test-web.html @@ -128,10 +128,10 @@
  • lexer.nas
  • life.nas
  • loop.nas
  • -
  • mandel.nas
  • mandelbrot.nas
  • +
  • mandelbrotset.nas
  • mcpu.nas
  • -
  • md5.nas
  • +
  • md5_self.nas
  • md5compare.nas
  • diff --git a/doc/pic/mandelbrotset.png b/doc/pic/mandelbrotset.png new file mode 100644 index 0000000..a6b541d Binary files /dev/null and b/doc/pic/mandelbrotset.png differ diff --git a/module/libfib.nas b/module/libfib.nas index a42ed9b..18819a7 100644 --- a/module/libfib.nas +++ b/module/libfib.nas @@ -44,7 +44,7 @@ var print_ghost = func(object) { } -var test_ghost=func() { +var test_ghost = func() { var ghost = create_ghost(); print_ghost(nil); # err print_ghost(ghost); # random diff --git a/module/libkey.nas b/module/libkey.nas index 829e99c..564266b 100644 --- a/module/libkey.nas +++ b/module/libkey.nas @@ -11,8 +11,8 @@ var ( var nb = lib.nas_noblock; var call = dylib.limitcall(0); return [ - func(){return call(kb);}, - func(){return call(gt);}, - func(){return call(nb);} + func() {return call(kb);}, + func() {return call(gt);}, + func() {return call(nb);} ]; }(); diff --git a/std/csv.nas b/std/csv.nas index 94800a9..7423360 100644 --- a/std/csv.nas +++ b/std/csv.nas @@ -1,12 +1,12 @@ # lib csv.nas # ValKmjolnir 2022/10/15 -var read = func(path, delimeter=",", endline="\n"){ +var read = func(path, delimeter=",", endline="\n") { var context = io.readfile(path); context = split(endline, context); - forindex(var i;context){ + forindex(var i;context) { context[i] = split(delimeter,context[i]); } - if(size(context)<=1){ + if (size(context)<=1) { die("incorrect csv file <"~path~">: "~size(context)~" line(s)."); } return { diff --git a/std/dylib.nas b/std/dylib.nas index f65c397..92f5bcf 100644 --- a/std/dylib.nas +++ b/std/dylib.nas @@ -7,7 +7,7 @@ var dlopen = func(libname) { # find dynamic lib from local dir first libname = (os.platform()=="windows"? ".\\":"./")~libname; - if(io.exists(libname)) + if (io.exists(libname)) return __dlopen(libname); # find dynamic lib through PATH var envpath = split(os.platform()=="windows"? ";":":",unix.getenv("PATH")); @@ -16,7 +16,7 @@ var dlopen = func(libname) { var path = os.platform()=="windows"? "\\module\\":"/module/"; foreach(var p;envpath) { p ~= path~libname; - if(io.exists(p)) { + if (io.exists(p)) { libname = p; break; } @@ -37,14 +37,14 @@ var dlcall = func(ptr, args...) { # get dlcall function with limited parameter list var limitcall = func(arg_size = 0) { - if(arg_size==0) {return func(ptr) {return __dlcall};} - elsif(arg_size==1) {return func(ptr, _0) {return __dlcall};} - elsif(arg_size==2) {return func(ptr, _0, _1) {return __dlcall};} - elsif(arg_size==3) {return func(ptr, _0, _1, _2) {return __dlcall};} - elsif(arg_size==4) {return func(ptr, _0, _1, _2, _3) {return __dlcall};} - elsif(arg_size==5) {return func(ptr, _0, _1, _2, _3, _4) {return __dlcall};} - elsif(arg_size==6) {return func(ptr, _0, _1, _2, _3, _4, _5) {return __dlcall};} - elsif(arg_size==7) {return func(ptr, _0, _1, _2, _3, _4, _5, _6) {return __dlcall};} - elsif(arg_size==8) {return func(ptr, _0, _1, _2, _3, _4, _5, _6, _7) {return __dlcall};} + if (arg_size==0) {return func(ptr) {return __dlcall};} + elsif (arg_size==1) {return func(ptr, _0) {return __dlcall};} + elsif (arg_size==2) {return func(ptr, _0, _1) {return __dlcall};} + elsif (arg_size==3) {return func(ptr, _0, _1, _2) {return __dlcall};} + elsif (arg_size==4) {return func(ptr, _0, _1, _2, _3) {return __dlcall};} + elsif (arg_size==5) {return func(ptr, _0, _1, _2, _3, _4) {return __dlcall};} + elsif (arg_size==6) {return func(ptr, _0, _1, _2, _3, _4, _5) {return __dlcall};} + elsif (arg_size==7) {return func(ptr, _0, _1, _2, _3, _4, _5, _6) {return __dlcall};} + elsif (arg_size==8) {return func(ptr, _0, _1, _2, _3, _4, _5, _6, _7) {return __dlcall};} else {return func(ptr, args...) {return __dlcallv};} } \ No newline at end of file diff --git a/std/fg_env.nas b/std/fg_env.nas index 0479a35..bba128a 100644 --- a/std/fg_env.nas +++ b/std/fg_env.nas @@ -1,6 +1,7 @@ # flightgear developer environments simulator (beta) # ValKmjolnir 2022 use std.runtime; +use std.coroutine; println("-------------------------------------------------------------"); println(" FlightGear simulated-env for developers project, since 2019"); @@ -15,8 +16,8 @@ var fg_env_cli={ "--fg-env-help":{ info:"get help", trigger:0, - f:func{ - if(me.trigger) + f:func { + if (me.trigger) return; println("-------------------------------------------------------------"); println(" Help:"); @@ -29,8 +30,8 @@ var fg_env_cli={ "--fg-env-debug":{ info:"get property tree structure", trigger:0, - f:func{ - if(me.trigger) + f:func { + if (me.trigger) return; props.globals.debug(); me.trigger=1; @@ -39,8 +40,8 @@ var fg_env_cli={ "--fg-env-mktmtest":{ info:"test maketimer", trigger:0, - f:func{ - if(me.trigger) + f:func { + if (me.trigger) return; maketimer_multi_coroutine_test(32); me.trigger=1; @@ -57,8 +58,8 @@ var fg_globals={ }; println("[\e[32m maketimer \e[0m] [",os.time(),"] new func add_event(name,interval,function)"); -var add_event=func(name,interval,function){ - fg_globals.event[name]=coroutine.create(func{ +var add_event = func(name,interval,function) { + fg_globals.event[name]=coroutine.create(func { var timestamp=maketimestamp(); timestamp.stamp(); while(timestamp.elapsedMSec()0){ - if(contains(tmp.val,path[i]~'['~index~']')) + if (path_size>0) { + if (contains(tmp.val,path[i]~'['~index~']')) return tmp.val[path[i]~'['~index~']']; else return tmp.val[path[i]]; @@ -238,89 +239,89 @@ var props={ println("[\e[32m props \e[0m] [",os.time(),"] init props.Node"); props.Node={ - new:func(values=nil){ + new:func(values=nil) { var res={ parents:fg_env_props_node_traits, val:{}, type:'GHOST', parent:nil }; - if(typeof(values)=="hash") + if (typeof(values)=="hash") res.val=values; return res; }, - addChild:func(name){ - if(!contains(me.val,name)){ + addChild:func(name) { + if (!contains(me.val,name)) { me.val[name]=props.Node.new(); me.val[name].parent=me; return 1; } return 0; }, - addChildren:func(name,cnt=0){ - for(var i=0;i1 and in_vec(tmp[-1])) { append(res, f); @@ -48,16 +48,17 @@ var find_all_files_with_extension = func(path, extensions...){ return res; } -var find_all_files = func(path){ +var find_all_files = func(path) { if (!io.exists(path)) { return []; } var dd = unix.opendir(path); var res = []; - while(var n = unix.readdir(dd)) - if(unix.isfile(path~"/"~n)) { + while(var n = unix.readdir(dd)) { + if (unix.isfile(path~"/"~n)) { append(res, n); } + } unix.closedir(dd); return res; } diff --git a/std/json.nas b/std/json.nas index 7cf97b9..8aab185 100644 --- a/std/json.nas +++ b/std/json.nas @@ -93,7 +93,7 @@ var parse = func() { } ptr += 1; } - if(ptr>=text_size) { + if (ptr>=text_size) { token.content = "eof"; token.type = _j_eof; return; @@ -167,7 +167,7 @@ var parse = func() { } var match = func(type) { - if(token.type!=type) { + if (token.type!=type) { println("json::parse: line ",line,": expect ",_j_content[type]," but get `",token.content,"`."); _parse_error += 1; } @@ -237,7 +237,7 @@ var parse = func() { return func(source) { _parse_error = 0; - if(typeof(source)!="str") { + if (typeof(source)!="str") { println("json::parse: must use string but get", typeof(str)); _parse_error += 1; return []; @@ -260,7 +260,7 @@ var parse = func() { var stringify = func(object) { _parse_error = 0; var object_type = typeof(object); - if(object_type!="hash" and object_type!="vec" and object_type!="namespace") { + if (object_type!="hash" and object_type!="vec" and object_type!="namespace") { _parse_error += 1; println("json::stringify: must use hashmap or vector, but get ", typeof(object)); return "[]"; diff --git a/std/lib.nas b/std/lib.nas index ce2afef..09b4680 100644 --- a/std/lib.nas +++ b/std/lib.nas @@ -1,12 +1,9 @@ # lib.nas # 2019 ValKmjolnir - -use std.coroutine; use std.math; use std.string; use std.io; use std.os; -use std.bits; use std.unix; # print is used to print all things in nasal, try and see how it works. @@ -235,7 +232,7 @@ var println = func(elems...) { var sort = func() { srand(); # be aware! this causes global changes var quick_sort_core = func(vec, left, right, cmp) { - if(left>=right) return nil; + if (left>=right) return nil; var base = left+int(rand()*(right-left)); (vec[left], vec[base]) = (vec[base], vec[left]); var (i, j, tmp) = (left, right, vec[left]); @@ -301,7 +298,7 @@ var ghosttype = func(ghost_object) { # get the index of val in the vec var vecindex = func(vec, val) { forindex(var i; vec) { - if(val==vec[i]) { + if (val==vec[i]) { return i; } } @@ -313,11 +310,11 @@ var isa = func(object, class) { if (!ishash(object)) { return false; } - if(!contains(object, "parents") or !isvec(object.parents)) { + if (!contains(object, "parents") or !isvec(object.parents)) { return false; } foreach(var elem; object.parents) { - if(elem==class or isa(elem, class)) { + if (elem==class or isa(elem, class)) { return true; } } diff --git a/std/list.nas b/std/list.nas index 2b70bd7..3c1aca3 100644 --- a/std/list.nas +++ b/std/list.nas @@ -10,7 +10,7 @@ var new = func() { prev: nil, next: nil }; - if(end!=nil) { + if (end!=nil) { end.next = tmp; tmp.prev = end; end = tmp; diff --git a/std/log.nas b/std/log.nas index b89f164..ce22517 100644 --- a/std/log.nas +++ b/std/log.nas @@ -1,18 +1,18 @@ # log.nas # ValKmjolnir 2022/6/14 -var log=func(){ +var log = func() { var (log_date,log_time,prefix)=(1,1,""); var os_time=""; - var prt_core=func(elem){ + var prt_core = func(elem) { os_time=os.time(); print(prefix," "); - if(log_date and log_time) + if (log_date and log_time) print(os_time," "); - elsif(log_date or log_time){ + elsif (log_date or log_time) { var s=split(" ",os_time); - if(log_date) + if (log_date) print(s[0]," "); - if(log_time) + if (log_time) print(s[1]," "); } foreach(var i;elem) @@ -20,19 +20,19 @@ var log=func(){ print("\n"); } return { - setflags:func(date,time){ + setflags:func(date,time) { log_date=!!date; log_time=!!time; }, - setprefix:func(s){ - if(typeof(s)!="str") + setprefix:func(s) { + if (typeof(s)!="str") println("[log.nas] must use string as the prefix."); prefix=s; }, - println:func(elem...){ + println:func(elem...) { prt_core(elem); }, - fatalln:func(elem...){ + fatalln:func(elem...) { prt_core(elem); die("log:fatal error"); } diff --git a/std/mat.nas b/std/mat.nas index 3c52e9a..42289c9 100644 --- a/std/mat.nas +++ b/std/mat.nas @@ -1,5 +1,5 @@ -var mat=func(width,height) { +var mat = func(width,height) { var res=[]; setsize(res,width*height); forindex(var i;res) { @@ -12,14 +12,14 @@ var mat=func(width,height) { }; } -var rand_init=func(a) { +var rand_init = func(a) { var ref=a.mat; forindex(var i;ref) { ref[i]=rand()*2-1; } } -var mat_print=func(a) { +var mat_print = func(a) { var (width,height,ref)=(a.width,a.height,a.mat); for(var i=0;i0.001) { epoch+=1; - if(epoch>1e4) { + if (epoch>1e4) { println("Training failed after ",epoch," epoch."); break; } @@ -248,7 +248,7 @@ var bp_example=func() { total+=sum(mult_num(mult(error,trans(error)),0.5)); } } - if(epoch<=1e4) { + if (epoch<=1e4) { println("Training succeeded after ",epoch," epoch."); } diff --git a/std/module.nas b/std/module.nas index bdb2888..5c03059 100644 --- a/std/module.nas +++ b/std/module.nas @@ -4,35 +4,36 @@ # this provides safe usage of dylib # when dylib is closed, # all the invalid functions cannot be called +use std.dylib; -var module_call_func=func(fptr,args){ +var module_call_func = func(fptr, args) { return __dlcallv; } -var extern={ - new: func(fptr){ - var isopen=1; +var extern = { + new: func(fptr) { + var isopen = 1; return { - close:func(){isopen=0;}, - call:func(args...){ + close: func() {isopen = 0;}, + call: func(args...) { return isopen?module_call_func(fptr,args):nil; } }; } }; -var module={ - new: func(name){ - var lib=dylib.dlopen(name); - var f={}; +var module = { + new: func(name) { + var lib = dylib.dlopen(name); + var f = {}; return { - get:func(symbol){ - if(contains(f,symbol)) + get: func(symbol) { + if (contains(f,symbol)) return f[symbol]; - var fp=extern.new(dylib.dlsym(lib,symbol)); - f[symbol]=fp; + var fp = extern.new(dylib.dlsym(lib,symbol)); + f[symbol] = fp; return fp; }, - close: func(){ - foreach(var i;keys(f)) + close: func() { + foreach(var i; keys(f)) f[i].close(); dylib.dlclose(lib); } diff --git a/std/process_bar.nas b/std/process_bar.nas index ae05498..cac9f07 100644 --- a/std/process_bar.nas +++ b/std/process_bar.nas @@ -2,49 +2,49 @@ # ValKmjolnir 2022/6/14 # this file is inspired by a Python lib: alive_progress -var bar=func(){ - var bar={ - solid_triangle_right:"▶", - hollow_triangle_right:"▷", - solid_triangle_left:"◀", - hollow_triangle_left:"◁", - solid_circle:"●", - hollow_circle:"○", - tick:"✔", - cross:"✘", - light_shadow:"░", - medium_shadow:"▒", - deep_shadow:"▓", - block:"█", - sharp:"#", - square:"√", - equal:"=", - space:" ", - point:".", - line:"━" +var bar = func() { + var bar = { + solid_triangle_right: "▶", + hollow_triangle_right: "▷", + solid_triangle_left: "◀", + hollow_triangle_left: "◁", + solid_circle: "●", + hollow_circle: "○", + tick: "✔", + cross: "✘", + light_shadow: "░", + medium_shadow: "▒", + deep_shadow: "▓", + block: "█", + sharp: "#", + square: "√", + equal: "=", + space: " ", + point: ".", + line: "━" }; - var separator={ - angle_bracket:["<",">"], - line:["|","|"], - bracket:["[","]"], - space:[" "," "], - curve:["(",")"] + var separator = { + angle_bracket: ["<",">"], + line: ["|","|"], + bracket: ["[","]"], + space: [" "," "], + curve: ["(",")"] }; - return func(front="sharp",back="space",sep="line",length=20){ - if(typeof(front)!="str" or !contains(bar,front)) + return func(front = "sharp", back = "space", sep = "line", length = 20) { + if (typeof(front)!="str" or !contains(bar,front)) front="sharp"; - if(typeof(back)!="str" or !contains(bar,back)) + if (typeof(back)!="str" or !contains(bar,back)) back="space"; - if(typeof(sep)!="str" or !contains(separator,sep)) + if (typeof(sep)!="str" or !contains(separator,sep)) sep="line"; front=bar[front]; back=bar[back]; sep=separator[sep]; return { - bar:func(number){ - if(number>1) + bar: func(number) { + if (number>1) number=1; - if(number<0) + if (number<0) number=0; var finish_length=int(number*length); var other=length-finish_length; @@ -62,32 +62,32 @@ var bar=func(){ # return a high resolution progress bar # example: # var bar=process_bar.high_resolution_bar(40); -# for(var i=0;i<=1;i+=0.001){ +# for(var i=0;i<=1;i+=0.001) { # print(bar.bar(i,40),'\r'); # unix.sleep(0.001); # } # println(); -var high_resolution_bar=func(){ +var high_resolution_bar = func() { var block=["▏","▎","▍","▌","▋","▊","▉","█"]; - return func(length){ + return func(length) { return { - bar: func(number){ - if(number>1) + bar: func(number) { + if (number>1) number=1; - if(number<0) + if (number<0) number=0; var block_len=number*length; var complete_block=int(block_len); var decimal=block_len-complete_block; var progress=complete_block+(decimal!=0); var s="|"; - for(var i=0;i16) + if (size(s)>16) s="****"; var vec=split("",s); var res=[]; var len=size(vec); var tmp=""; - for(var i=0;i=size(type)) + if (counter>=size(type)) counter=0; return s; } @@ -236,71 +236,71 @@ var spinner=func(){ }; }(); -var default_bar=func(name="classic",length=20){ - if(typeof(name)!="str") +var default_bar = func(name = "classic", length = 20) { + if (typeof(name)!="str") name="classic"; - if(name=="classic") + if (name=="classic") return process_bar.bar("sharp","point","bracket",length); - elsif(name=="classic2") + elsif (name=="classic2") return process_bar.bar("equal","point","bracket",length); - elsif(name=="classic3") + elsif (name=="classic3") return process_bar.bar("sharp","point","line",length); - elsif(name=="classic4") + elsif (name=="classic4") return process_bar.bar("equal","point","line",length); - elsif(name=="triangle") + elsif (name=="triangle") return process_bar.bar("solid_triangle_right","hollow_triangle_right","angle_bracket",length); - elsif(name=="dots") + elsif (name=="dots") return process_bar.bar("solid_circle","hollow_circle","curve",length); - elsif(name=="ticks") + elsif (name=="ticks") return process_bar.bar("tick","space","line",length); - elsif(name=="deep_shadow") + elsif (name=="deep_shadow") return process_bar.bar("deep_shadow","light_shadow","line",length); - elsif(name=="block") + elsif (name=="block") return process_bar.bar("block","light_shadow","line",length); - elsif(name=="oneline") + elsif (name=="oneline") return process_bar.bar("line","space","space",length); else return process_bar.bar("sharp","point","bracket",length); } -var default_spinner=func(name="classic",repeat=1){ - if(typeof(name)!="str") +var default_spinner = func(name = "classic", repeat = 1) { + if (typeof(name)!="str") name="classic"; - if(name=="rise") + if (name=="rise") return process_bar.spinner("rise",repeat); - elsif(name=="vertical") + elsif (name=="vertical") return process_bar.spinner("vertical",repeat); - elsif(name=="dot") + elsif (name=="dot") return process_bar.spinner("dot",repeat); - elsif(name=="dots") + elsif (name=="dots") return process_bar.spinner("dots",repeat); - elsif(name=="arrow") + elsif (name=="arrow") return process_bar.spinner("arrow",repeat); - elsif(name=="classic") + elsif (name=="classic") return process_bar.spinner("classic",repeat); - elsif(name=="balls") + elsif (name=="balls") return process_bar.spinner("balls",repeat); - elsif(name=="dots_wave") + elsif (name=="dots_wave") return process_bar.spinner("dots_wave",repeat); - elsif(name=="pulse") + elsif (name=="pulse") return process_bar.spinner("pulse",repeat); - elsif(name=="wave") + elsif (name=="wave") return process_bar.spinner("wave",repeat); - elsif(name=="short_wave") + elsif (name=="short_wave") return process_bar.spinner("short_wave",repeat); - elsif(name=="fish") + elsif (name=="fish") return process_bar.spinner("fish",repeat); - elsif(name=="happy") + elsif (name=="happy") return process_bar.spinner("happy",repeat); - elsif(name=="wait") + elsif (name=="wait") return process_bar.spinner("wait",repeat); - elsif(name=="stars") + elsif (name=="stars") return process_bar.spinner("stars",repeat); else return process_bar.spinner("classic",repeat); } -var show=func(){ +var show = func() { print("\ec"); var bars={ "classic ":process_bar.default_bar("classic",40), @@ -333,12 +333,12 @@ var show=func(){ }; var bar_key=keys(bars); var spin_key=keys(spinners); - for(var i=0;i<40;i+=1){ - forindex(var j;bar_key){ + for(var i=0; i<40; i+=1) { + forindex(var j; bar_key) { var k=bar_key[j]; print("\e["~(j+1)~";1H["~k~"] "~bars[k].bar((i+1)/40)); } - forindex(var j;spin_key){ + forindex(var j; spin_key) { var k=spin_key[j]; print("\e["~(j+1+size(bars))~";1H["~k~"] |"~spinners[k].next()~"|"); } diff --git a/std/props.nas b/std/props.nas index 5719e37..ffb693f 100644 --- a/std/props.nas +++ b/std/props.nas @@ -195,15 +195,15 @@ var Node = { getPath : func { var (name, index, parent) = (me.getName(), me.getIndex(), me.getParent()); - if(index != 0) { name ~= "[" ~ index ~ "]"; } - if(parent != nil) { name = parent.getPath() ~ "/" ~ name; } + if (index != 0) { name ~= "[" ~ index ~ "]"; } + if (parent != nil) { name = parent.getPath() ~ "/" ~ name; } return name; }, getBoolValue : func { var val = me.getValue(); var mytype = me.getType(); - if((mytype == "STRING" or mytype == "UNSPECIFIED") and val == "false") return 0; + if ((mytype == "STRING" or mytype == "UNSPECIFIED") and val == "false") return 0; return !!val; }, @@ -216,7 +216,7 @@ var Node = { }, remove : func { - if((var p = me.getParent()) == nil) return nil; + if ((var p = me.getParent()) == nil) return nil; p.removeChild(me.getName(), me.getIndex()); }, @@ -300,7 +300,7 @@ var Node = { # Node.new = func(values = nil) { var result = wrapNode(_new()); - if(ishash(values)) { + if (ishash(values)) { result.setValues(values); } return result; @@ -316,18 +316,18 @@ Node.new = func(values = nil) { # Node.getValues = func { var children = me.getChildren(); - if(!size(children)) return me.getValue(); + if (!size(children)) return me.getValue(); var val = {}; var numchld = {}; foreach(var c; children) { var name = c.getName(); - if(contains(numchld, name)) { var nc = numchld[name]; } + if (contains(numchld, name)) { var nc = numchld[name]; } else { var nc = size(me.getChildren(name)); numchld[name] = nc; - if(nc > 1 and !contains(val, name)) val[name] = []; + if (nc > 1 and !contains(val, name)) val[name] = []; } - if(nc > 1) append(val[name], c.getValues()); + if (nc > 1) append(val[name], c.getValues()); else val[name] = c.getValues(); } return val; @@ -346,13 +346,13 @@ Node.getValues = func { # Node.initNode = func(path = nil, value = 0, type = nil, force = 0) { var prop = me.getNode(path or "", 1); - if(prop.getType() != "NONE") value = prop.getValue(); - if(force) prop.clearValue(); - if(type == nil) prop.setValue(value); - elsif(type == "DOUBLE") prop.setDoubleValue(value); - elsif(type == "INT") prop.setIntValue(value); - elsif(type == "BOOL") prop.setBoolValue(value); - elsif(type == "STRING") prop.setValue("" ~ value); + if (prop.getType() != "NONE") value = prop.getValue(); + if (force) prop.clearValue(); + if (type == nil) prop.setValue(value); + elsif (type == "DOUBLE") prop.setDoubleValue(value); + elsif (type == "INT") prop.setIntValue(value); + elsif (type == "BOOL") prop.setBoolValue(value); + elsif (type == "STRING") prop.setValue("" ~ value); else die("initNode(): unsupported type '" ~ type ~ "'"); return prop; } @@ -363,7 +363,7 @@ Node.initNode = func(path = nil, value = 0, type = nil, force = 0) { # to a key for a fun hack. # var dump = func { - if(size(arg) == 1) { var prefix = ""; var node = arg[0]; } + if (size(arg) == 1) { var prefix = ""; var node = arg[0]; } else { var prefix = arg[0]; var node = arg[1]; } var index = node.getIndex(); @@ -371,13 +371,13 @@ var dump = func { var name = node.getName(); var val = node.getValue(); - if(val == nil) { val = "nil"; } + if (val == nil) { val = "nil"; } name = prefix ~ name; - if(index > 0) { name = name ~ "[" ~ index ~ "]"; } + if (index > 0) { name = name ~ "[" ~ index ~ "]"; } print(name, " {", type, "} = ", val); # Don't recurse into aliases, lest we get stuck in a loop - if(type != "ALIAS") { + if (type != "ALIAS") { var children = node.getChildren(); foreach(var c; children) { dump(name ~ "/", c); } } @@ -413,12 +413,12 @@ var copy = func(src, dest, attr = 0) { } var type = src.getType(); var val = src.getValue(); - if(type == "ALIAS" or type == "NONE") return; - elsif(type == "BOOL") dest.setBoolValue(val); - elsif(type == "INT" or type == "LONG") dest.setIntValue(val); - elsif(type == "FLOAT" or type == "DOUBLE") dest.setDoubleValue(val); + if (type == "ALIAS" or type == "NONE") return; + elsif (type == "BOOL") dest.setBoolValue(val); + elsif (type == "INT" or type == "LONG") dest.setIntValue(val); + elsif (type == "FLOAT" or type == "DOUBLE") dest.setDoubleValue(val); else dest.setValue(val); - if(attr) dest.setAttribute(src.getAttribute()); + if (attr) dest.setAttribute(src.getAttribute()); } ## @@ -426,9 +426,9 @@ var copy = func(src, dest, attr = 0) { # array) into Node objects. # var wrap = func(node) { - if(isghost(node)) { + if (isghost(node)) { return wrapNode(node); - } elsif(isvec(node)) { + } elsif (isvec(node)) { var v = node; var n = size(v); for(var i=0; i 0) return left > right; + if (op < 0) return left < right; + if (op > 0) return left > right; return left == right; } @@ -622,7 +622,7 @@ var _cond_cmp = func(p, op) { # in the binding. # var runBinding = func(node, module = nil) { - if(module != nil and node.getNode("module") == nil) + if (module != nil and node.getNode("module") == nil) node.getNode("module", 1).setValue(module); var cmd = node.getNode("command", 1).getValue() or "null"; condition(node.getNode("condition")) ? fgcommand(cmd, node) : 0; @@ -702,13 +702,13 @@ var UpdateManager = me.localType = me.property.getType(); if (me.localType == "INT" or me.localType == "LONG" or me.localType == "FLOAT" or me.localType == "DOUBLE") { - if(me.lastval == nil or math.abs(me.lastval - me.curval) >= me.delta) + if (me.lastval == nil or math.abs(me.lastval - me.curval) >= me.delta) { me.lastval = me.curval; me.changed(me.curval); } } - else if(me.lastval == nil or me.lastval != me.curval) + else if (me.lastval == nil or me.lastval != me.curval) { me.lastval = me.curval; me.changed(me.curval); diff --git a/std/queue.nas b/std/queue.nas index 1c98f84..d662e77 100644 --- a/std/queue.nas +++ b/std/queue.nas @@ -1,34 +1,34 @@ # queue.nas # valkmjolnir 2021/3/31 -var new=func(){ - var (begin,end)=(nil,nil); +var new = func() { + var (begin, end) = (nil, nil); return{ - push:func(elem){ + push: func(elem) { var new_node={ elem:elem, next:nil }; - if(begin==nil) + if (begin==nil) begin=end=new_node; - else{ + else { end.next=new_node; end=new_node; } }, - pop:func(){ - if(begin!=nil) + pop: func() { + if (begin!=nil) begin=begin.next; - if(begin==nil) + if (begin==nil) end=nil; }, - front:func(){ - if(begin!=nil) + front: func() { + if (begin!=nil) return begin.elem; }, - clear:func(){ + clear: func() { begin=end=nil; }, - empty:func(){ + empty: func() { return begin==nil; } }; diff --git a/std/string.nas b/std/string.nas index 81da2fa..bed819f 100644 --- a/std/string.nas +++ b/std/string.nas @@ -1,7 +1,7 @@ # string.nas # ValKmjolnir 2022/10/5 -var join = func(sep, vec){ +var join = func(sep, vec) { var len = size(vec); var res = ""; for(var i = 0; i 0 and size(hostname) != 0) { - while(socket.bind(client, hostname, port)<0){ + while(socket.bind(client, hostname, port)<0) { println("[",os.time(),"] failed to bind socket "~client~" at ", hostname, ":", port, "."); unix.sleep(retry_delay); println("[",os.time(),"] retrying..."); diff --git a/std/unix.nas b/std/unix.nas index 9639400..88f0282 100644 --- a/std/unix.nas +++ b/std/unix.nas @@ -1,5 +1,6 @@ # unix.nas # 2023 by ValKmjolnir +use std.bits; var _S_IFDIR = 0x4000; var _S_IFREG = 0x8000; diff --git a/test/ascii-art.nas b/test/ascii-art.nas index 2f04b89..95c53ea 100644 --- a/test/ascii-art.nas +++ b/test/ascii-art.nas @@ -31,14 +31,14 @@ var char_ttf=[ ["███████╗","╚══███╔╝"," ███╔╝ "," ███╔╝ ","███████╗","╚══════╝"], ]; -var trans_ttf=func(string){ +var trans_ttf = func(string) { var str=["","","","","",""]; - for(var i=0;i=0;i-=1){ + for(var loop=0;loop=0;i-=1) { var rand_index=int(i*rand()); (arr[i],arr[rand_index])=(arr[rand_index],arr[i]); } @@ -102,7 +102,7 @@ var curve3=func(line=2){ return; } -var curve4=func(line=4){ +var curve4 = func(line=4) { var shadow=["m░\e[0m","m▒\e[0m","m▓\e[0m","m█\e[0m","m▀\e[0m","m▄\e[0m","m▐\e[0m","m▌\e[0m"]; var front=[ "30","31","32","33","34","35","36","37", @@ -113,16 +113,16 @@ var curve4=func(line=4){ "100","101","102","103","104","105","106","107" ]; rand(time(0)); - for(var i=0;i180) +var position_change = func(position_val,value) { + if (position_val+value>180) position_val += value-360; - else if(position_val+value<-180) + else if (position_val+value<-180) position_val += value+360; else position_val += value; return position_val; } -var road_check_func = func(){ +var road_check_func = func() { var lat = props.getNode("/position/latitude-deg",1).getValue(); var lon = props.getNode("/position/longitude-deg",1).getValue(); var position_info = geodinfo(lat,lon); var position_names = position_info[1].names; - if((position_names[0]=="Freeway") or (position_names[0]=="Road")){ + if ((position_names[0]=="Freeway") or (position_names[0]=="Road")) { var car_heading = 0; var lat_change = 0; var lon_change = 0; var left_range = 0; var right_range = 0; - for(var i=0;i>-0.00005;i-=0.000001){ + for(var i=0;i>-0.00005;i-=0.000001) { car_heading = props.getNode("/orientation/heading-deg",1).getValue(); lat_change = math.sin(D2R*car_heading); lon_change = -math.cos(D2R*car_heading); @@ -41,12 +41,12 @@ var road_check_func = func(){ lon = props.getNode("/position/longitude-deg",1).getValue()+0.0001*math.sin(D2R*car_heading); var other_position_info = geodinfo(position_change(lat,i*lat_change),position_change(lon,i*lon_change)); var other_names = other_position_info[1].names; - if((other_names[0]=="Freeway") or (other_names[0]=="Road")) + if ((other_names[0]=="Freeway") or (other_names[0]=="Road")) right_range += 1; else break; } - for(var i=0;i<0.00005;i+=0.000001){ + for(var i=0;i<0.00005;i+=0.000001) { car_heading = props.getNode("/orientation/heading-deg",1).getValue(); lat_change = math.sin(D2R*car_heading); lon_change = -math.cos(D2R*car_heading); @@ -54,7 +54,7 @@ var road_check_func = func(){ lon = props.getNode("/position/longitude-deg",1).getValue()+0.0001*math.sin(D2R*car_heading); var other_position_info = geodinfo(position_change(lat,i*lat_change),position_change(lon,i*lon_change)); var other_names = other_position_info[1].names; - if((other_names[0]=="Freeway") or (other_names[0]=="Road")) + if ((other_names[0]=="Freeway") or (other_names[0]=="Road")) left_range+=1; else break; @@ -64,9 +64,9 @@ var road_check_func = func(){ derivative=(error-previous_error)/dt; var (Kp,Ki,Kd)=(1/900,0.05,0.005); # print("change p ",Kp*error*error,' i ',Ki*intergral,' d ',Kd*derivative); - if(error<0) + if (error<0) props.getNode("/", 1).setValue("/controls/flight/rudder",-Kp*error*error+Ki*intergral+Kd*derivative); - else if(error>0) + else if (error>0) props.getNode("/", 1).setValue("/controls/flight/rudder",Kp*error*error+Ki*intergral+Kd*derivative); else props.getNode("/", 1).setValue("/controls/flight/rudder",0); @@ -81,12 +81,12 @@ var road_check_func = func(){ }; var road_check_timer = maketimer(0.01,road_check_func); -var toggle_auto_pilot = func(){ - if(!road_check_timer.isRunning){ +var toggle_auto_pilot = func() { + if (!road_check_timer.isRunning) { intergral=0; road_check_timer.start(); props.getNode("/sim/messages/copilot",1).setValue('/',"ze dong sheng teaan see tong yee tse yung. Auto Sheng Teaan System Activated!"); - }else{ + } else { road_check_timer.stop(); props.getNode("/sim/messages/copilot",1).setValue('/',"ze dong sheng teaan see tong yee guan bee. Auto Sheng Teaan System is off."); } diff --git a/test/bf.nas b/test/bf.nas index 1afe0b8..546446c 100644 --- a/test/bf.nas +++ b/test/bf.nas @@ -147,7 +147,7 @@ var mandelbrot= var (ptr,pc,paper,inum)=(0,0,[],[]); -var character=func() { +var character = func() { var res=[]; setsize(res,256); forindex(var i;res) { @@ -159,55 +159,55 @@ var character=func() { var (add,mov,jt,jf,in,out)=( func {paper[ptr]+=inum[pc];}, func {ptr+=inum[pc];}, - func {if(paper[ptr])pc=inum[pc];}, - func {if(!paper[ptr])pc=inum[pc];}, + func {if (paper[ptr])pc=inum[pc];}, + func {if (!paper[ptr])pc=inum[pc];}, func {paper[ptr]=input()[0];}, func {print(character[paper[ptr]]);} ); -var codegen=func(program) { +var codegen = func(program) { var (code,stack)=([],[]); var len=size(program); for(var i=0;i') { + } elsif (c=='<' or c=='>') { append(code,mov); append(inum,0); - for(;i') { + for(;i') { inum[-1]+=1; - } elsif(chr(program[i])=='<') { + } elsif (chr(program[i])=='<') { inum[-1]-=1; - } elsif(chr(program[i])!='\n') { + } elsif (chr(program[i])!='\n') { i-=1; break; } } - } elsif(c==',') { + } elsif (c==',') { append(code,in); append(inum,0); - } elsif(c=='.') { + } elsif (c=='.') { append(code,out); append(inum,0); - } elsif(c=='[') { + } elsif (c=='[') { append(code,jf); append(inum,0); append(stack,size(code)-1); - } elsif(c==']') { - if(!size(stack)) { + } elsif (c==']') { + if (!size(stack)) { die("lack ["); } var label=pop(stack); @@ -217,7 +217,7 @@ var codegen=func(program) { } } - if(size(stack)) { + if (size(stack)) { die("lack "~size(stack)~" \"]\""); return; } @@ -225,9 +225,9 @@ var codegen=func(program) { return code; } -var bf=func(program) { +var bf = func(program) { # enable ANSI escape sequence - if(os.platform()=="windows") { + if (os.platform()=="windows") { system("color"); } diff --git a/test/bfconvertor.nas b/test/bfconvertor.nas index 55907c9..074c844 100644 --- a/test/bfconvertor.nas +++ b/test/bfconvertor.nas @@ -145,7 +145,7 @@ var mandelbrot= +[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<< <<<<<]]>>>]"; -var padding=func(len) { +var padding = func(len) { var res=""; for(var i=0;i0) { + if (cnt>0) { f~="paper[ptr]+="~cnt~";\n"; - } elsif(cnt<0) { + } elsif (cnt<0) { f~="paper[ptr]-="~(-cnt)~";\n"; } - } elsif(c=='<' or c=='>') { + } elsif (c=='<' or c=='>') { var cnt=0; for(;i') { + if (chr(program[i])=='>') { cnt+=1; - } elsif(chr(program[i])=='<') { + } elsif (chr(program[i])=='<') { cnt-=1; - } elsif(chr(program[i])!='\n') { + } elsif (chr(program[i])!='\n') { i-=1; break; } } - if(cnt!=0) { + if (cnt!=0) { f~=padding(size(stack)); } - if(cnt>0) { + if (cnt>0) { f~="ptr+="~cnt~";\n"; - } elsif(cnt<0) { + } elsif (cnt<0) { f~="ptr-="~(-cnt)~";\n"; } - } elsif(c==',') { + } elsif (c==',') { f~=padding(size(stack)); f~="paper[ptr]=input()[0];\n"; - } elsif(c=='.') { + } elsif (c=='.') { f~=padding(size(stack)); f~="print(chr(paper[ptr]));\n"; - } elsif(c=='[') { + } elsif (c=='[') { f~=padding(size(stack)); f~="while(paper[ptr]) {\n"; append(stack,0); - } elsif(c==']') { - if(!size(stack)) { + } elsif (c==']') { + if (!size(stack)) { println("lack ["); return; } @@ -219,7 +219,7 @@ var bf=func(program) { f~="}\n"; } } - if(size(stack)) { + if (size(stack)) { println("lack ]"); return; } diff --git a/test/bfs.nas b/test/bfs.nas index 1520e7a..3775981 100644 --- a/test/bfs.nas +++ b/test/bfs.nas @@ -3,15 +3,15 @@ use std.queue; rand(time(0)); var pixel=[' ','#','.','*']; var map=[]; -for(var i=0;i<10;i+=1){ +for(var i=0;i<10;i+=1) { append(map,[]); for(var j=0;j<20;j+=1) append(map[i],(rand()>0.7)); } -var prt=func(){ +var prt = func() { var s="\e[0;0H+--------------------+\n"; - for(var i=0;i<10;i+=1){ + for(var i=0;i<10;i+=1) { s~="|"; for(var j=0;j<20;j+=1) s~=pixel[map[i][j]]; @@ -22,27 +22,27 @@ var prt=func(){ unix.sleep(1/800); } -var bfs=func(begin,end){ +var bfs = func(begin,end) { var move=[[1,0],[0,1],[-1,0],[0,-1]]; var que=queue.new(); que.push(begin); map[begin[0]][begin[1]]=2; map[end[0]][end[1]]=0; - if(map[1][0]==1 and map[0][1]==1) + if (map[1][0]==1 and map[0][1]==1) map[1][0]=0; - while(!que.empty()){ + while(!que.empty()) { var vertex=que.front(); que.pop(); - foreach(var i;move){ + foreach(var i;move) { var x=vertex[0]+i[0]; var y=vertex[1]+i[1]; - if(x==end[0] and y==end[1]){ + if (x==end[0] and y==end[1]) { map[x][y]=3; prt(); print("reached.\n"); return; } - if(0<=x and x<10 and 0<=y and y<20 and map[x][y]==0){ + if (0<=x and x<10 and 0<=y and y<20 and map[x][y]==0) { que.push([x,y]); map[x][y]=2; } @@ -54,7 +54,7 @@ var bfs=func(begin,end){ } # enable ANSI escape sequence -if(os.platform()=="windows") +if (os.platform()=="windows") system("color"); print("\ec"); bfs([0,0],[9,19]); \ No newline at end of file diff --git a/test/bp.nas b/test/bp.nas index 88dadf9..198ac38 100644 --- a/test/bp.nas +++ b/test/bp.nas @@ -2,7 +2,7 @@ use std.mat; rand(time(0)); -var new_neuron=func(){ +var new_neuron = func() { return { in:0, out:0, @@ -12,18 +12,18 @@ var new_neuron=func(){ }; } -var tanh=func(x){ +var tanh = func(x) { var (a,b)=(math.exp(x),math.exp(-x)); return (a-b)/(a+b); } -var difftanh=func(x){ +var difftanh = func(x) { x=tanh(x); return 1-x*x; } -var sigmoid=func(x){ +var sigmoid = func(x) { return 1/(1+math.exp(-x)); } -var diffsigmoid=func(x){ +var diffsigmoid = func(x) { x=sigmoid(x); return x*(1-x); } @@ -33,7 +33,7 @@ var training_set=[[0,0],[0,1],[1,0],[1,1]]; var expect=[0,1,1,0]; var hidden=[]; -for(var i=0;i0.5?-2*rand():2*rand()); @@ -41,22 +41,22 @@ for(var i=0;i0.5?-2*rand():2*rand()); output[i].bia=rand()>0.5?-5*rand():5*rand(); } -var forward=func(x){ +var forward = func(x) { var input=training_set[x]; - for(var i=0;i0.0005){ +while(error>0.0005) { error=0; - for(var i=0;i<4;i+=1){ + for(var i=0;i<4;i+=1) { forward(i); error+=get_error(i); backward(i); } cnt+=1; - if(cnt>=1e4) + if (cnt>=1e4) break; } -if(cnt>=3e5){ +if (cnt>=3e5) { print("failed to train, ",cnt," epoch.\n"); -}else{ +} else { print('finished after ',cnt,' epoch.\n'); } -foreach(var v;training_set){ +foreach(var v;training_set) { run(v); print(v,': ',output[0].out,'\n'); } diff --git a/test/calc.nas b/test/calc.nas index 516a2db..98a3d41 100644 --- a/test/calc.nas +++ b/test/calc.nas @@ -2,18 +2,18 @@ use std.padding; use std.file; var source=file.find_all_files_with_extension("./src","cpp","h"); -sort(source,func(a,b){return cmp(a,b)<0}); +sort(source,func(a,b) {return cmp(a,b)<0}); var lib=file.find_all_files_with_extension("./std","nas"); -sort(lib,func(a,b){return cmp(a,b)<0}); +sort(lib,func(a,b) {return cmp(a,b)<0}); var testfile=file.find_all_files_with_extension("./test","nas"); -sort(testfile,func(a,b){return cmp(a,b)<0}); +sort(testfile,func(a,b) {return cmp(a,b)<0}); var module=file.find_all_files_with_extension("./module","cpp","nas"); -sort(module,func(a,b){return cmp(a,b)<0}); +sort(module,func(a,b) {return cmp(a,b)<0}); -var longest=func(vec...){ +var longest = func(vec...) { var len=0; foreach(var v;vec) foreach(var f;v) @@ -22,41 +22,41 @@ var longest=func(vec...){ } var padding_length=longest(source,lib,testfile,module); -var blank=func(s){ - if(!size(s)){ +var blank = func(s) { + if (!size(s)) { return 1; } var space=[" "[0],"\n"[0],"\t"[0],"\r"[0]]; - for(var i=0;i=1000?substr(str(number/1000),0,4)~'k':str(number); return padding.leftpad(number,6); } -var calc=func(codetype,files,path=""){ +var calc = func(codetype,files,path="") { println(codetype); var (bytes,ctx,line,semi,line_cnt,semi_cnt)=(0,"",0,0,0,0); - forindex(var i;files){ + forindex(var i;files) { var s=io.exists(path~files[i])?io.readfile(path~files[i]):""; (line_cnt,semi_cnt)=(count(s,'\n'),count(s,';')); println(padding.rightpad(files[i],padding_length),'|', diff --git a/test/choice.nas b/test/choice.nas index 6b04247..c2e9699 100644 --- a/test/choice.nas +++ b/test/choice.nas @@ -1,21 +1,21 @@ var condition_true=1; var condition_false=0; -if(condition_true) { +if (condition_true) { var a=1; -} else if(!condition_false) { +} else if (!condition_false) { var b=1; -} elsif(!condition_true and condition_false) { +} elsif (!condition_true and condition_false) { print("impossible"); } else { var c=1; var d=1; } -if(condition_true) +if (condition_true) var a=1; -else if(!condition_false) +else if (!condition_false) var b=1; -elsif(!condition_true and condition_false) +elsif (!condition_true and condition_false) print("impossible"); else var c=1; \ No newline at end of file diff --git a/test/class.nas b/test/class.nas index c326a05..a28cadc 100644 --- a/test/class.nas +++ b/test/class.nas @@ -1,4 +1,4 @@ -var student=func(n,a){ +var student = func(n,a) { return { print_info:func println(n,' ',a), set_age: func(age) a=age, @@ -19,31 +19,31 @@ s.set_name('Sidi Liang'); s.print_info(); println(s.get_age(),' ',s.get_name()); # flightgear nasal-console cannot use this kind of object initializing -var m=func(){ +var m = func() { var (_1,_2)=(0,1); return { - a:func(){ + a:func() { print(_1,' ',_2,'\n'); }, - b:func(x){ + b:func(x) { _1=x; }, - c:func(x){ + c:func(x) { _2=x; }, - d:func(x){ - return func{ + d:func(x) { + return func { print(_1,' ',_2,' ',x,'\n'); }; }, - g:func(x){ + g:func(x) { var y=x; - return func{ + return func { print(_1,' ',_2,' ',x,' ',y,'\n'); } }, - h:func(){ - return func(x){ + h:func() { + return func(x) { _1=x; } } diff --git a/test/console3D.nas b/test/console3D.nas index 9226d68..0703a46 100644 --- a/test/console3D.nas +++ b/test/console3D.nas @@ -24,7 +24,7 @@ use module.libmat; use std.runtime; -func(){ +func() { # allocate more spaces for(var i = 0; i<10; i+=1) { runtime.gc.extend("str"); @@ -71,61 +71,61 @@ var (rotateX,rotateY,rotateZ)=( libmat.vec3.rz, ); -var use_raw=func(){ - vec2=func(x,y){return [x,y];} - vec2add=func(v1,v2){return [v1[0]+v2[0],v1[1]+v2[1]];} - vec2sub=func(v1,v2){return [v1[0]-v2[0],v1[1]-v2[1]];} - vec2mul=func(v1,v2){return [v1[0]*v2[0],v1[1]*v2[1]];} - vec2div=func(v1,v2){return [v1[0]/v2[0],v1[1]/v2[1]];} - vec3=func(x,y,z){return [x,y,z];} - vec3add=func(v1,v2){return [v1[0]+v2[0],v1[1]+v2[1],v1[2]+v2[2]];} - vec3sub=func(v1,v2){return [v1[0]-v2[0],v1[1]-v2[1],v1[2]-v2[2]];} - vec3mul=func(v1,v2){return [v1[0]*v2[0],v1[1]*v2[1],v1[2]*v2[2]];} - vec3div=func(v1,v2){return [v1[0]/v2[0],v1[1]/v2[1],v1[2]/v2[2]];} - vec3neg=func(v){return [-v[0],-v[1],-v[2]];} - vec2len=func(v){var (x,y)=(v[0],v[1]); return sqrt(x*x+y*y);} - vec3len=func(v){var (x,y,z)=(v[0],v[1],v[2]); return sqrt(x*x+y*y+z*z);} - vec3norm=func(v){var t=vec3len(v); return vec3div(v,[t,t,t]);} - vec3dot=func(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];} - rotateX=func(a,angle){return [a[0],a[2]*sin(angle)+a[1]*cos(angle),a[2]*cos(angle)-a[1]*sin(angle)];} - rotateY=func(a,angle){return [a[0]*cos(angle)-a[2]*sin(angle),a[1],a[0]*sin(angle)+a[2]*cos(angle)];} - rotateZ=func(a,angle){return [a[0]*cos(angle)-a[1]*sin(angle),a[0]*sin(angle)+a[1]*cos(angle),a[2]];} +var use_raw = func() { + vec2 = func(x,y) {return [x,y];} + vec2add = func(v1,v2) {return [v1[0]+v2[0],v1[1]+v2[1]];} + vec2sub = func(v1,v2) {return [v1[0]-v2[0],v1[1]-v2[1]];} + vec2mul = func(v1,v2) {return [v1[0]*v2[0],v1[1]*v2[1]];} + vec2div = func(v1,v2) {return [v1[0]/v2[0],v1[1]/v2[1]];} + vec3 = func(x,y,z) {return [x,y,z];} + vec3add = func(v1,v2) {return [v1[0]+v2[0],v1[1]+v2[1],v1[2]+v2[2]];} + vec3sub = func(v1,v2) {return [v1[0]-v2[0],v1[1]-v2[1],v1[2]-v2[2]];} + vec3mul = func(v1,v2) {return [v1[0]*v2[0],v1[1]*v2[1],v1[2]*v2[2]];} + vec3div = func(v1,v2) {return [v1[0]/v2[0],v1[1]/v2[1],v1[2]/v2[2]];} + vec3neg = func(v) {return [-v[0],-v[1],-v[2]];} + vec2len = func(v) {var (x,y)=(v[0],v[1]); return sqrt(x*x+y*y);} + vec3len = func(v) {var (x,y,z)=(v[0],v[1],v[2]); return sqrt(x*x+y*y+z*z);} + vec3norm = func(v) {var t=vec3len(v); return vec3div(v,[t,t,t]);} + vec3dot = func(a,b) {return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];} + rotateX = func(a,angle) {return [a[0],a[2]*sin(angle)+a[1]*cos(angle),a[2]*cos(angle)-a[1]*sin(angle)];} + rotateY = func(a,angle) {return [a[0]*cos(angle)-a[2]*sin(angle),a[1],a[0]*sin(angle)+a[2]*cos(angle)];} + rotateZ = func(a,angle) {return [a[0]*cos(angle)-a[1]*sin(angle),a[0]*sin(angle)+a[1]*cos(angle),a[2]];} } -var clamp=func(value,_min,_max){ +var clamp = func(value,_min,_max) { return max(min(value,_max),_min); } -var sign=func(a){ +var sign = func(a) { return (0edge; } -var vec3abs=func(v){ +var vec3abs = func(v) { return [abs(v[0]),abs(v[1]),abs(v[2])]; } -var vec3sign=func(v){ +var vec3sign = func(v) { return [sign(v[0]),sign(v[1]),sign(v[2])]; } -var vec3step=func(edge,v){ +var vec3step = func(edge,v) { return [step(edge[0],v[0]),step(edge[1],v[1]),step(edge[2],v[2])]; } -var vec3reflect=func(rd,n){ +var vec3reflect = func(rd,n) { var d=vec3dot(n,rd); return vec3sub(rd,vec3mul(n,vec3mul([2,2,2],[d,d,d]))); } -var sphere=func(ro,rd,r) { +var sphere = func(ro,rd,r) { var b=vec3dot(ro,rd); var c=vec3dot(ro,ro)-r*r; var h=b*b-c; - if(h<0.0) return [-1.0,-1.0]; + if (h<0.0) return [-1.0,-1.0]; h=sqrt(h); return [-b-h,-b+h]; } -var box=func(ro,rd,boxSize,outNormal) { +var box = func(ro,rd,boxSize,outNormal) { var m=vec3div([1.0,1.0,1.0],rd); var n=vec3mul(m,ro); var k=vec3mul(vec3abs(m),boxSize); @@ -143,11 +143,11 @@ var box=func(ro,rd,boxSize,outNormal) { return [tN, tF]; } -var plane=func(ro,rd,p,w) { +var plane = func(ro,rd,p,w) { return -(vec3dot(ro,p)+w)/vec3dot(rd,p); } -var main=func(frame) { +var main = func(frame) { var height=15*2; var width=int(height*1/0.618)*2; @@ -171,10 +171,10 @@ var main=func(frame) { print("\e[2J"); var stamp=maketimestamp(); - for(var t=0;t0){ + if (intersection[0]>0) { var itPoint=vec3add(vec3sub(ro,spherePos),vec3mul(rd,[intersection[0],intersection[0],intersection[0]])); minIt=intersection[0]; n=vec3norm(itPoint); } var boxN=[0,0,0]; intersection=box(ro,rd,vec3_111,boxN); - if(intersection[0]>0 and intersection[0]0 and intersection[0]0 and intersection[0]0 and intersection[0]=0;i-=1) { @@ -10,7 +10,7 @@ var mess=func(vec) { } } -var project=func(n) { +var project = func(n) { # get(s) :- color(_, s, _). var ts=maketimestamp(); @@ -24,7 +24,7 @@ var project=func(n) { for(var i=0;i1/500) { + if ((i-last_step)/n>1/500) { last_step=i; print(" ",bar.bar((i+1)/n)," ", padding.leftpad(str(int((i+1)/n*100)),3),"% | \r"); @@ -45,7 +45,7 @@ var project=func(n) { println(padding.rightpad(str(cnt),7)," in ",ts.elapsedMSec()/1000," s"); } -var select=func(n) { +var select = func(n) { # get(s) :- color(_, _, x), message(x, s). var ts=maketimestamp(); @@ -62,7 +62,7 @@ var select=func(n) { color[i]=[i,"color "~i,i+n*10]; message[i]=[i+n*10,"message "~i]; # generate process bar, every 0.2% - if((i-last_step)/n>1/500) { + if ((i-last_step)/n>1/500) { last_step=i; print(" ",bar.bar((i+1)/n)," ", padding.leftpad(str(int((i+1)/n*100)),3),"% | \r"); @@ -75,8 +75,8 @@ var select=func(n) { mess(message); ts.stamp(); - sort(color,func(a,b){return a[2]res) { + } else if (data>res) { left=mid+1; } else { right=mid-1; @@ -100,7 +100,7 @@ var select=func(n) { println(padding.rightpad(str(cnt),7)," in ",ts.elapsedMSec()/1000," s"); } -var cartesian=func(n) { +var cartesian = func(n) { # get(x, y, z, a, b) :- color(x, y, z), message(a, b). var ts=maketimestamp(); @@ -117,7 +117,7 @@ var cartesian=func(n) { color[i]=[i,"color "~i,i+n*10]; message[i]=[i+n*10,"message "~i]; # generate process bar, every 0.2% - if((i-last_step)/n>1/500) { + if ((i-last_step)/n>1/500) { last_step=i; print(" ",bar.bar((i+1)/n)," ", padding.leftpad(str(int((i+1)/n*100)),3),"% | \r"); diff --git a/test/diff.nas b/test/diff.nas index 02ad2cc..9a7a492 100644 --- a/test/diff.nas +++ b/test/diff.nas @@ -1,4 +1,4 @@ -var myers=func(src,dst,show_table=0){ +var myers = func(src,dst,show_table=0) { (src,dst)=(split("\n",src),split("\n",dst)); append(src,""); append(dst,""); @@ -6,12 +6,12 @@ var myers=func(src,dst,show_table=0){ var mat=[]; setsize(mat,dst_len*src_len); - forindex(var i;mat){ + forindex(var i;mat) { mat[i]=0; } var visited=[]; setsize(visited,dst_len*src_len); - forindex(var i;visited){ + forindex(var i;visited) { visited[i]=0; } @@ -19,15 +19,15 @@ var myers=func(src,dst,show_table=0){ forindex(var x;src) mat[y*src_len+x]=(src[x]==dst[y]); - if(show_table){ + if (show_table) { var curve=[ ["+---","| "], ["+---","| \\ "] ]; var s=""; - forindex(var y;dst){ - forindex(var t;curve[0]){ - forindex(var x;src){ + forindex(var y;dst) { + forindex(var t;curve[0]) { + forindex(var x;src) { s~=curve[mat[y*src_len+x]][t]; } s~=["+","|"][t]~"\n"; @@ -40,23 +40,23 @@ var myers=func(src,dst,show_table=0){ var (total,path,vec)=([],[],[[0,0,-1]]); visited[0]=1; - while(size(vec)){ + while(size(vec)) { append(total,vec); var tmp=[]; - forindex(var i;vec){ + forindex(var i;vec) { var elem=vec[i]; var (x,y)=(elem[1],elem[0]); # find solution - if(x==src_len-1 and y==dst_len-1){ + if (x==src_len-1 and y==dst_len-1) { append(path,vec[i]); - for(var (prev,iter)=(elem[2],size(total)-1);iter>0;iter-=1){ + for(var (prev,iter)=(elem[2],size(total)-1);iter>0;iter-=1) { var t=total[iter-1][prev]; append(path,t); prev=t[2]; } - if(show_table){ + if (show_table) { for(var t=size(path)-1;t>=0;t-=1) print("("~path[t][1]~","~path[t][0]~")",t==0?"":"->"); println(); @@ -66,16 +66,16 @@ var myers=func(src,dst,show_table=0){ for(var t=0;ty and y>0 and x>0 and 80>x and D>z[o]){ + if (22>y and y>0 and x>0 and 80>x and D>z[o]) { z[o]=D; b[o]=chars[N>0?N:0]; } @@ -49,8 +49,8 @@ var main=func(run_time){ } } -if(size(runtime.argv()) and !math.isnan(num(runtime.argv()[0]))){ +if (size(runtime.argv()) and !math.isnan(num(runtime.argv()[0]))) { main(num(runtime.argv()[0])); -}else{ +} else { main(5e2); } \ No newline at end of file diff --git a/test/exception.nas b/test/exception.nas index 207e62b..a6160e6 100644 --- a/test/exception.nas +++ b/test/exception.nas @@ -1,22 +1,22 @@ var ResultTrait={ - Ok:func(val){ + Ok:func(val) { me.ok=val; me.flag=0; return me; }, - Err:func(info){ + Err:func(info) { me.err=info; me.flag=1; return me; }, - unwrap:func(){ - if(me.flag) + unwrap:func() { + if (me.flag) die(me.err); return me.ok; } }; -var Result=func(){ +var Result = func() { return{ ok:nil, err:"", @@ -25,11 +25,11 @@ var Result=func(){ }; }; -var a=func(){ +var a = func() { return Result().Ok("hello world"); } -var b=func(){ +var b = func() { return Result().Err("exception test"); } diff --git a/test/feigenbaum.nas b/test/feigenbaum.nas index e7aab39..009b8ad 100644 --- a/test/feigenbaum.nas +++ b/test/feigenbaum.nas @@ -37,12 +37,13 @@ var RGB = func(h, w) { } var progress = (h*width+w+1)/(width*height); - if(progress*100-int(progress*100)==0){ + if (progress*100-int(progress*100)==0) { print(bar.bar(progress), " ", progress*100, "% \r"); } var c = char(res); return c~c~c; } + ppm("feigenbaum.ppm", width, height, RGB); println(); \ No newline at end of file diff --git a/test/fib.nas b/test/fib.nas index 49501cd..841ccca 100644 --- a/test/fib.nas +++ b/test/fib.nas @@ -1,8 +1,6 @@ -var fib=func(x) -{ - if(x<2) return x; +var fib = func(x) { + if (x<2) return x; return fib(x-1)+fib(x-2); } for(var i=0;i<31;i+=1) print(fib(i),'\n'); - \ No newline at end of file diff --git a/test/filesystem.nas b/test/filesystem.nas index 87b6347..92d6521 100644 --- a/test/filesystem.nas +++ b/test/filesystem.nas @@ -1,5 +1,5 @@ -var files=func(path){ - if(!io.exists(path)) +var files = func(path) { + if (!io.exists(path)) return []; var dd=unix.opendir(path); var res=[]; @@ -8,30 +8,30 @@ var files=func(path){ unix.closedir(dd); return res; } -var prt=func(s,path){ +var prt = func(s,path) { var vec=files(path); var last=size(vec)-1; - forindex(var i;vec){ + forindex(var i;vec) { var f=vec[i]; - if(f=="." or f=="..") + if (f=="." or f=="..") continue; foreach(var j;s) print("\e[34m",j,"\e[0m"); - if(unix.isdir(path~"/"~f)){ + if (unix.isdir(path~"/"~f)) { println("\e[34m",i==last?" └─":" ├─","\e[0m\e[33m[",f,"]\e[36m>\e[0m"); append(s,i==last?" ":" │ "); prt(s,path~"/"~f); pop(s); - }elsif(unix.isfile(path~"/"~f)){ + } elsif (unix.isfile(path~"/"~f)) { println("\e[34m",i==last?" └─":" ├─","\e[0m\e[32m",f,"\e[0m"); - }else{ + } else { println("\e[34m",i==last?" └─":" ├─","\e[0m\e[91m",f,"\e[0m"); } } } # enable unicode -if(os.platform()=="windows") +if (os.platform()=="windows") system("chcp 65001"); println("\e[33m[",unix.getcwd(),"]\e[36m>\e[0m"); prt([""],"."); \ No newline at end of file diff --git a/test/hexdump.nas b/test/hexdump.nas index d77c15e..b90606d 100644 --- a/test/hexdump.nas +++ b/test/hexdump.nas @@ -4,7 +4,7 @@ use std.file; use std.runtime; # init -var hex=func(){ +var hex = func() { var hex_num=[ '0','1','2','3', '4','5','6','7', @@ -12,8 +12,8 @@ var hex=func(){ 'c','d','e','f' ]; var res=[]; - foreach(var i;hex_num){ - foreach(var j;hex_num){ + foreach(var i;hex_num) { + foreach(var j;hex_num) { append(res,i~j); } } @@ -21,11 +21,11 @@ var hex=func(){ }(); # read file -var s=func(){ +var s = func() { var filename = file.find_all_files_with_extension("./src","cpp","h"); - if(size(runtime.argv())!=0){ + if (size(runtime.argv())!=0) { var argv=runtime.argv(); - if(argv[0]=="-h" or argv[0]=="--h"){ + if (argv[0]=="-h" or argv[0]=="--h") { println("usage:"); println(" nasal hexdump.nas | get all files' hexdump."); println(" nasal hexdump.nas [file] | get single file's hexdump."); @@ -46,24 +46,24 @@ var cnt=0; var hex_index=[0,0,0,0]; # print binary in text format -var textprint=func(index){ +var textprint = func(index) { var info=""; - if(os.platform()=="windows"){ + if (os.platform()=="windows") { for(var i=index-cnt;i=127)?".":chr(s[i]); - }else{ + } else { for(var i=index-cnt;i=len) + var next = func() { + if (index+1>=len) return index+1; index+=1; s=char(file_text[index]); return index; } - var prev=func(){ + var prev = func() { index-=1; s=char(file_text[index]); } - while(1){ - if(next()>=len) + while(1) { + if (next()>=len) break; - if(s==">") + if (s==">") content~=">"; - elsif(s=="<") + elsif (s=="<") content~="<"; - elsif(s=="[" or s=="]" or s=="(" or s==")" or s=="{" or s=="}") + elsif (s=="[" or s=="]" or s=="(" or s==")" or s=="{" or s=="}") content~=""~s~""; - elsif(s=="=" or s=="," or s==";" or s==":" or s=="|" or s=="&" or s=="!" or s=="?" or s=="+" or s=="-" or s=="*" or s=="/" or s=="~" or s==".") + elsif (s=="=" or s=="," or s==";" or s==":" or s=="|" or s=="&" or s=="!" or s=="?" or s=="+" or s=="-" or s=="*" or s=="/" or s=="~" or s==".") content~=""~s~""; - elsif(s=="_" or ("a"[0]<=s[0] and s[0]<="z"[0]) or ("A"[0]<=s[0] and s[0]<="Z"[0]) or s[0]<0 or s[0]>=128){ + elsif (s=="_" or ("a"[0]<=s[0] and s[0]<="z"[0]) or ("A"[0]<=s[0] and s[0]<="Z"[0]) or s[0]<0 or s[0]>=128) { var tmp=""~s; # generate a new string - while(1){ - if(next()>=len) + while(1) { + if (next()>=len) break; - if(s=="_" or ("a"[0]<=s[0] and s[0]<="z"[0]) or ("A"[0]<=s[0] and s[0]<="Z"[0]) or ("0"[0]<=s[0] and s[0]<="9"[0]) or s[0]<0 or s[0]>=128) + if (s=="_" or ("a"[0]<=s[0] and s[0]<="z"[0]) or ("A"[0]<=s[0] and s[0]<="Z"[0]) or ("0"[0]<=s[0] and s[0]<="9"[0]) or s[0]<0 or s[0]>=128) tmp~=s; - else{ + else { prev(); break; } } var is_key=0; foreach(var i;keyword) - if(tmp==i){ + if (tmp==i) { is_key=1; content~=""~tmp~""; break; } - if(!is_key) + if (!is_key) content~=""~tmp~""; - }elsif("0"[0]<=s[0] and s[0]<="9"[0]){ + } elsif ("0"[0]<=s[0] and s[0]<="9"[0]) { content~=""~s; - if(next()>=len){ + if (next()>=len) { content~=""; break; } - if(s=="o"){ + if (s=="o") { content~="o"; - while(1){ - if(next()>=len) + while(1) { + if (next()>=len) break; - if("0"[0]<=s[0] and s[0]<="7"[0]) + if ("0"[0]<=s[0] and s[0]<="7"[0]) content~=s; else break; } content~=""; prev(); - }elsif(s=="x"){ + } elsif (s=="x") { content~="x"; - while(1){ - if(next()>=len) + while(1) { + if (next()>=len) break; - if(("0"[0]<=s[0] and s[0]<="9"[0]) or ("a"[0]<=s[0] and s[0]<='f') or ("A"[0]<=s[0] or s[0]<="F")) + if (("0"[0]<=s[0] and s[0]<="9"[0]) or ("a"[0]<=s[0] and s[0]<='f') or ("A"[0]<=s[0] or s[0]<="F")) content~=s; else break; } content~=""; prev(); - }elsif(("0"[0]<=s[0] and s[0]<="9"[0]) or s=="." or s=="e"){ - while("0"[0]<=s[0] and s[0]<="9"[0]){ + } elsif (("0"[0]<=s[0] and s[0]<="9"[0]) or s=="." or s=="e") { + while("0"[0]<=s[0] and s[0]<="9"[0]) { content~=s; - if(next()>=len) + if (next()>=len) break; } - if(s=="."){ + if (s==".") { content~=s; - if(next()>=len) + if (next()>=len) break; } - while("0"[0]<=s[0] and s[0]<="9"[0]){ + while("0"[0]<=s[0] and s[0]<="9"[0]) { content~=s; - if(next()>=len) + if (next()>=len) break; } - if(s=="e"){ + if (s=="e") { content~=s; - if(next()>=len) + if (next()>=len) break; - if(s=="-" or s=="+"){ + if (s=="-" or s=="+") { content~=s; - if(next()>=len) + if (next()>=len) break; } } - while("0"[0]<=s[0] and s[0]<="9"[0]){ + while("0"[0]<=s[0] and s[0]<="9"[0]) { content~=s; - if(next()>=len) + if (next()>=len) break; } prev(); content~=""; - }else{ + } else { prev(); content~=""; } - }elsif(s=="\"" or s=="'" or s=="`"){ + } elsif (s=="\"" or s=="'" or s=="`") { var quot=s~""; # generate a new string content~=""~s; - while(1){ - if(next()>=len) + while(1) { + if (next()>=len) break; - if(s==quot){ + if (s==quot) { content~=s~""; break; - }elsif(s=="\\"){ + } elsif (s=="\\") { content~=s; - if(next()>=len) + if (next()>=len) break; content~=s; - }elsif(s==">"){ + } elsif (s==">") { content~=">"; - }elsif(s=="<"){ + } elsif (s=="<") { content~="<"; - }else{ + } else { content~=s; } } - }elsif(s=="#"){ + } elsif (s=="#") { content~=""~s; - while(1){ - if(next()>=len) + while(1) { + if (next()>=len) break; - if(s=="\n" or s=="\r"){ + if (s=="\n" or s=="\r") { content~=s; break; - }elsif(s==">"){ + } elsif (s==">") { content~=">"; - }elsif(s=="<"){ + } elsif (s=="<") { content~="<"; - }else{ + } else { content~=s; } } @@ -242,11 +242,11 @@ var html_read_file=func(filename){ } var respond={ - ok:func(html){ + ok:func(html) { println("[",os.time(),"] respond 200 OK"); return "Http/1.1 200 OK\n\n"~html~"\n"; }, - not_found:func(){ + not_found:func() { println("[",os.time(),"] respond 404 NOT FOUND"); return "Http/1.1 404 NOT FOUND\n\n @@ -260,7 +260,7 @@ var respond={ \n"; }, - teapot:func(){ + teapot:func() { println("[",os.time(),"] respond 418 I'm a teapot"); return "Http/1.1 418 I'm a teapot\n\n @@ -276,7 +276,7 @@ var respond={ } }; -var files=func(){ +var files = func() { var res={}; var dd=unix.opendir("./test"); while((var name=unix.readdir(dd))!=nil) @@ -284,61 +284,61 @@ var files=func(){ return res; }(); -while(1){ +while(1) { var client=http.accept(); var data=http.recv(client); - if(data==nil){ + if (data==nil) { http.disconnect(client); continue; } - if(data.type=="GET"){ + if (data.type=="GET") { var path=data.path; var args=split("?",path); var tmp={}; - if(size(args)==2){ + if (size(args)==2) { path=args[0]; args=split("=",args[1]); for(var i=0;i"~highlight_style~"\n
    \n";
                     var page_back="
    \n\n\n"; http.send(client,respond.ok(page~html_read_file("./test/"~filename)~page_back)); - }else{ + } else { http.send(client,respond.ok(io.readfile("./doc/nasal-http-test-web.html"))); } } - elsif(path=="/shutdown"){ + elsif (path=="/shutdown") { http.send(client,respond.ok("http server shutdown.")); break; } - elsif(path=="/favicon.ico") + elsif (path=="/favicon.ico") http.send(client,respond.ok(io.readfile("./doc/pic/favicon.ico"))); - elsif(path=="/license") + elsif (path=="/license") http.send(client,respond.ok(io.readfile("./LICENSE"))); - elsif(path=="/doc/pic/nasal.png" or + elsif (path=="/doc/pic/nasal.png" or path=="/doc/pic/social.png" or path=="/doc/pic/benchmark.png" or path=="/doc/pic/mandelbrot.png" or path=="/doc/pic/feigenbaum.png" or path=="/doc/pic/burningship.png") http.send(client,respond.ok(io.readfile("."~path))); - else{ + else { var filename=substr(path,1,size(path)-1); - if(contains(files,filename)){ + if (contains(files,filename)) { var page=" "~filename~" "~highlight_style~"\n
    \n";
                     var page_back="
    \n\n\n"; http.send(client,respond.ok(page~html_read_file("./test/"~filename)~page_back)); } - elsif(filename=="teapot") + elsif (filename=="teapot") http.send(client,respond.teapot()); else http.send(client,respond.not_found()); } - }elsif(data.type=="POST"){ + } elsif (data.type=="POST") { http.send(client,respond.not_found); } http.disconnect(client); diff --git a/test/json.nas b/test/json.nas index fbc053d..c8f3167 100644 --- a/test/json.nas +++ b/test/json.nas @@ -13,7 +13,7 @@ var ss = json.stringify({ emptyvec:[], empty:[{}], empty_an:[[[[[[{}]]]]]], - function:func(){} + function:func() {} }); println(ss, "\n"); @@ -30,7 +30,7 @@ var ss = json.stringify([{ emptyhash:{}, emptyvec:[], empty_an:[[[[[{}]]]]], - function:func(){} + function:func() {} }]); println(ss, "\n"); diff --git a/test/jsonrpc.nas b/test/jsonrpc.nas index 56b4484..c5dfaa7 100644 --- a/test/jsonrpc.nas +++ b/test/jsonrpc.nas @@ -4,16 +4,16 @@ use std.runtime; var socket = libsock.socket; -var gettime=func(){ +var gettime = func() { return split(" ",os.time())[1]; } -var jsonRPC=func(){ +var jsonRPC = func() { var sd=nil; return { establish:func(ip,port) { sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP); - if(socket.bind(sd,ip,port)<0) { + if (socket.bind(sd,ip,port)<0) { println("[",gettime(),"] failed to bind socket ",sd," at ",ip,":",port); return 0; } @@ -42,23 +42,23 @@ var jsonRPC=func(){ println("[",gettime(),"] disconnected"); return socket.closesocket(client.sd); }, - recv:func(client){ + recv:func(client) { var data=socket.recv(client.sd,2048); - if(data.size<=0){ + if (data.size<=0) { println("[",gettime(),"] closed connection, recv failed"); return nil; } println("[",gettime(),"] receive ",data.str); return data.str; }, - send:func(client,content){ + send:func(client,content) { println("[",gettime(),"] sending ",content); return socket.send(client.sd,content); } }; }(); -var server=func(ip,port) { +var server = func(ip,port) { var methods={ callHello:func(vec) { var res="hello "; @@ -103,7 +103,7 @@ var server=func(ip,port) { jsonRPC.disconnect(client); } -var client=func(ip,port) { +var client = func(ip,port) { srand(); var call_id=1; var methods=["callHello","notExist","onRandom"]; diff --git a/test/leetcode1319.nas b/test/leetcode1319.nas index 5da0642..2ae7b5f 100644 --- a/test/leetcode1319.nas +++ b/test/leetcode1319.nas @@ -2,28 +2,27 @@ var n=4; var input=[[0,1],[0,2],[1,2]]; -var find_root=func(x,parent) -{ +var find_root = func(x,parent) { while(parent[x]!=nil) x=parent[x]; return x; } -var union_root=func(x,y,parent) -{ + +var union_root = func(x,y,parent) { var x_root=find_root(x,parent); var y_root=find_root(y,parent); - if(x_root==y_root) return 0; + if (x_root==y_root) return 0; else parent[x_root]=y_root; return 1; } -var makeConnect=func(n,connections) -{ - if(size(connections)=len) + if (ptr>=len) print("read eof when generating string.\n"); ptr+=1; gen(str); }, - num_gen:func(){ + num_gen:func() { var number=chr(s[ptr]); ptr+=1; - if(ptr' or c=='<' or c=='!' or c=='='){ + if (c=='+' or c=='-' or c=='~' or c=='/' or c=='*' or c=='>' or c=='<' or c=='!' or c=='=') { var tmp=c; ptr+=1; - if(ptr0) + elsif (c!=' ' and c!='\t' and c!='\n' and c!='\r' and s[ptr]>0) gen(c); ptr+=1; return; }, - compile:func(){ + compile:func() { line=1; - while(ptr=height) _height=0; - if(_width>=width) _width=0; + var check = func(_width,_height) { + if (_height>=height) _height=0; + if (_width>=width) _width=0; return map[_height][_width]=='O'; } # enable ANSI escape sequence - if(os.platform()=="windows") + if (os.platform()=="windows") system("color"); print("\ec"); rand(time(0)); @@ -42,13 +42,13 @@ var run=func(width,height){ forindex(var j;map[i]) map[i][j]=rand()<0.45?'O':'.'; - for(var r=0;r<100;r+=1){ + for(var r=0;r<100;r+=1) { prt(map); for(var i=0;i=height) _height=0; - if(_width>=width) _width=0; + var check = func(_width,_height) { + if (_height>=height) _height=0; + if (_width>=width) _width=0; return map[_height*width+_width]==1; } - for(var r=0;r<1001;r+=1){ + for(var r=0;r<1001;r+=1) { ts.stamp(); - for(var i=0;i4){ + if ((x0*x0)+(y0*y0)>4) { pixel=chr(" .:;+=xX$&"[iter/8]); break; } diff --git a/test/ppmgen.nas b/test/mandelbrotset.nas similarity index 100% rename from test/ppmgen.nas rename to test/mandelbrotset.nas diff --git a/test/mcpu.nas b/test/mcpu.nas index 767d4dd..7860d2c 100644 --- a/test/mcpu.nas +++ b/test/mcpu.nas @@ -1,3 +1,5 @@ +use std.bits; + var inst={ inst_stop:0, inst_mov_reg_reg:1, @@ -26,24 +28,24 @@ var inst={ inst_out:24 }; -var hex=func(){ +var hex = func() { var vec=[]; foreach(var i;['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']) foreach(var j;['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']) append(vec,i~j); - return func(n){ + return func(n) { return vec[n]; } }(); -var hex32=func(n){ +var hex32 = func(n) { return hex(bits.u32_and(n/math.pow(2,24),0xff))~ hex(bits.u32_and(n/math.pow(2,16),0xff))~ hex(bits.u32_and(n/math.pow(2,8),0xff))~ hex(bits.u32_and(n,0xff)); } -var machine=func(disk_file){ +var machine = func(disk_file) { var reg=[]; var reg_size=32; @@ -51,7 +53,7 @@ var pc=0; var ir=[0,0,0,0]; # 32 bit instruction word var mem=[]; var mem_size=1024*1024*4; # memory size, byte -var init=func(){ +var init = func() { println("[",os.time(),"] init ",reg_size," registers."); setsize(reg,reg_size); # 8 bit address wire for(var i=0;ireg[ir[3]]; - }elsif(op==inst.inst_leq){ + } elsif (op==inst.inst_leq) { reg[ir[1]]=reg[ir[2]]<=reg[ir[3]]; - }elsif(op==inst.inst_geq){ + } elsif (op==inst.inst_geq) { reg[ir[1]]=reg[ir[2]]>=reg[ir[3]]; - }elsif(op==inst.inst_eq){ + } elsif (op==inst.inst_eq) { reg[ir[1]]=reg[ir[2]]==reg[ir[3]]; - }elsif(op==inst.inst_in){ + } elsif (op==inst.inst_in) { reg[0]=0; # unfinished - }elsif(op==inst.inst_out){ + } elsif (op==inst.inst_out) { println("reg[",ir[1],"]: 0x",hex32(reg[ir[1]])); } pc+=4; diff --git a/test/md5_self.nas b/test/md5_self.nas index b7b3d54..692a22a 100644 --- a/test/md5_self.nas +++ b/test/md5_self.nas @@ -1,32 +1,34 @@ -var check=func(x){ - if(x<0x100000000) +use std.bits; + +var check = func(x) { + if (x<0x100000000) return x; return x-floor(x/0x100000000)*0x100000000; } -var u32_bits_and=func(x,y){ +var u32_bits_and = func(x,y) { return bits.u32_and(check(x),check(y)); } -var u32_bits_or=func(x,y){ +var u32_bits_or = func(x,y) { return bits.u32_or(check(x),check(y)); } -var u32_bits_xor=func(x,y){ +var u32_bits_xor = func(x,y) { return bits.u32_xor(check(x),check(y)); } -var u32_bits_not=func(x){ +var u32_bits_not = func(x) { return bits.u32_not(check(x)); } -var hex32str=func(){ +var hex32str = func() { var ch=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]; var tbl=[]; setsize(tbl,256); - for(var i=0;i<16;i+=1){ + for(var i=0;i<16;i+=1) { for(var j=0;j<16;j+=1) tbl[i*16+j]=ch[i]~ch[j]; } - return func(num){ + return func(num) { var res=""; - for(var i=0;i<4;i+=1){ + for(var i=0;i<4;i+=1) { res~=tbl[u32_bits_and(num,0xff)]; num=floor(num/256); } @@ -34,7 +36,7 @@ var hex32str=func(){ }; }(); -var md5=func(){ +var md5 = func() { var K=[ 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, @@ -59,42 +61,42 @@ var md5=func(){ 0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9 ]; - var l=func(num,cx){ - for(var i=0;i56){ + } elsif (mod>56) { res_size=floor(s_size/64)*64+120; # 512+448=960 960/8=120 } setsize(res,res_size); @@ -132,11 +134,11 @@ var md5=func(){ # little endian setsize(res,size(res)+8); var (s_size,lower32,higher32)=(size(res),check(len),check(len/math.pow(2,32))); - for(var i=4;i>0;i-=1){ + for(var i=4;i>0;i-=1) { res[s_size-4-i]=floor(lower32-floor(lower32/256)*256); lower32=floor(lower32/256); } - for(var i=4;i>0;i-=1){ + for(var i=4;i>0;i-=1) { res[s_size-i]=floor(higher32-floor(higher32/256)*256); higher32=floor(higher32/256); } @@ -146,7 +148,7 @@ var md5=func(){ # this may only work when string's length is under 1<<51 var tmp=[]; setsize(tmp,size(res)/4); - for(var i=0;i0.5?-1:1); statistics[int(size(statistics)/2+u*size(statistics)/2)]+=1; } var s=["","",""]; - foreach(var st;statistics){ + foreach(var st;statistics) { var max_rate=100/size(statistics); var rate=st/total*100; - for(var i=size(s)-1;i>=0;i-=1){ - if(rate>=max_rate){ + for(var i=size(s)-1;i>=0;i-=1) { + if (rate>=max_rate) { s[i]~="█"; rate-=max_rate; - }else{ + } else { s[i]~=rise[rate/max_rate*size(rise)]; rate=0; } } } var tmp=""; - for(var i=0;i100){ + if (math.isnan(mem_occ) or mem_occ<0 or mem_occ>100) { mem_occ=0; } var cpu_occ=nil; - while((cpu_occ=coroutine.resume(co)[0])==nil){ + while((cpu_occ=coroutine.resume(co)[0])==nil) { var key=libkey.nonblock(); coroutine.resume(rd); - if(key!=nil and chr(key)=="q") + if (key!=nil and chr(key)=="q") return; } - if(is_windows_platform or is_macos_platform){ + if (is_windows_platform or is_macos_platform) { # sorry this is not real data cpu_occ=rand()*10; mem_occ=rand()*10+40; } - for(var i=0;i90?"\e[91m":"\e[32m",bar.bar(cpu_occ/100)~" ",cpu_occ,"\e[0m "); var tmp=""; - for(var i=0;i<70;i+=1){ + for(var i=0;i<70;i+=1) { tmp~="-"; } var s=["","",""]; - foreach(var occ;cpu_occupation_log){ + foreach(var occ;cpu_occupation_log) { var max_rate=50/size(s); var rate=occ; - for(var i=size(s)-1;i>=0;i-=1){ - if(rate>=max_rate){ + for(var i=size(s)-1;i>=0;i-=1) { + if (rate>=max_rate) { s[i]~="█"; rate-=max_rate; - }else{ + } else { s[i]~=rise[rate/max_rate*size(rise)]; rate=0; } @@ -183,14 +184,14 @@ func(){ println("\e[11;1H \e[32m+"~tmp~"+\e[0m"); var s=["","",""]; - foreach(var occ;mem_occupation_log){ + foreach(var occ;mem_occupation_log) { var max_rate=100/size(s); var rate=occ; - for(var i=size(s)-1;i>=0;i-=1){ - if(rate>=max_rate){ + for(var i=size(s)-1;i>=0;i-=1) { + if (rate>=max_rate) { s[i]~="█"; rate-=max_rate; - }else{ + } else { s[i]~=rise[rate/max_rate*size(rise)]; rate=0; } diff --git a/test/prime.nas b/test/prime.nas index 7f179d1..50f6b82 100644 --- a/test/prime.nas +++ b/test/prime.nas @@ -1,25 +1,25 @@ -var is_prime=func(x){ +var is_prime = func(x) { for(var i=2;i=i){ + if (x>=i) { for(var j=i+1;j<=math.sqrt(x);j+=1) - if(x/j==int(x/j)) + if (x/j==int(x/j)) return 0; append(primes,x); return 1; @@ -29,10 +29,10 @@ var filter=func(x){ return 1; } -func(){ +func() { var cnt=0; for(var i=2;i<50000;i+=1) - if(filter(i)) + if (filter(i)) cnt+=1; println(cnt); }(); diff --git a/test/qrcode.nas b/test/qrcode.nas index b1e0f38..3b4c4c1 100644 --- a/test/qrcode.nas +++ b/test/qrcode.nas @@ -31,10 +31,10 @@ var code=[ ]; # enable unicode -if(os.platform()=="windows") +if (os.platform()=="windows") system("chcp 65001"); var texture=[" ","██"]; -for(var i=0;i=right) return nil; + var quick_sort_core = func(vec,left,right) { + if (left>=right) return nil; var base=left+int(rand()*(right-left)); (vec[left],vec[base])=(vec[base],vec[left]); var (i,j,tmp)=(left,right,vec[left]); - while(i= `A` and mutable[i] <= `Z`) { + if (mutable[i] >= `A` and mutable[i] <= `Z`) { mutable[i] += (`a` - `A`); } } @@ -290,9 +290,9 @@ var completelyDone = dummyFunc; for(#OUTER; var i=0; i<100; i = i+1) { for(var j=0; j<100; j = j+1) { - if(doneWithInnerLoopEarly()) { + if (doneWithInnerLoopEarly()) { break; - } elsif(completelyDone()) { + } elsif (completelyDone()) { break #OUTER; } } @@ -308,21 +308,21 @@ for(#OUTER; ## var dump = func(o) { var result = ""; - if(typeof(o) == "scalar") { + if (typeof(o) == "scalar") { var n = num(o); - if(n == nil) { result = result ~ '"' ~ o ~ '"'; } + if (n == nil) { result = result ~ '"' ~ o ~ '"'; } else { result = result ~ o; } - } elsif(typeof(o) == "vector") { + } elsif (typeof(o) == "vector") { result = result ~ "[ "; - if(size(o) > 0) { result = result ~ dump(o[0]); } + if (size(o) > 0) { result = result ~ dump(o[0]); } for(i=1; i 0) { + if (size(o) > 0) { var k = ks[0]; result = result ~ k ~ ":" ~ dump(o[k]); } @@ -348,7 +348,7 @@ var dump = func(o) { # normal function definition. Oh well, every language has a syntactic # quirk or two...) # -var a = (func(n){ n + 1 })(232); # "a" now equals 233 +var a = (func(n) { n + 1 })(232); # "a" now equals 233 # # Functional programming B. All expressions have a value, the last @@ -357,7 +357,7 @@ var a = (func(n){ n + 1 })(232); # "a" now equals 233 # (assignment, duh) have side effects. e.g. The "if" expression works # both for code flow and as the ?: expression in C/C++. # -var factorial = func(n) { if(n == 0) { 1 } +var factorial = func(n) { if (n == 0) { 1 } else { n * factorial(n-1) } } print(factorial(10), "\n"); diff --git a/test/scalar.nas b/test/scalar.nas index e2c9feb..6e16ef1 100644 --- a/test/scalar.nas +++ b/test/scalar.nas @@ -55,19 +55,19 @@ var hash_4={ }; # function -var func_1=func(){return 1;} -var prt=func(x){println(x);return nil;} -var func_with_dynamic_id=func(a,b,c,d...){return [a,b,c,d];} -var func_with_lack_para=func(a,b,c=1,d=2){return a+b+c+d;} -var func_with_func_para=func(a,f){return f(a);} +var func_1 = func() {return 1;} +var prt = func(x) {println(x);return nil;} +var func_with_dynamic_id = func(a,b,c,d...) {return [a,b,c,d];} +var func_with_lack_para = func(a,b,c=1,d=2) {return a+b+c+d;} +var func_with_func_para = func(a,f) {return f(a);} func_with_lack_para(a:1, b:2, c:3, d:4); func_with_lack_para(b:1, c:3, a:4, d:1); func_with_func_para(f:func prt,a:1); -func_with_func_para(func func_1(),func(x){return x;}); +func_with_func_para(func func_1(),func(x) {return x;}); func_with_func_para(func_1(),func_1); prt(func func_1()); -var test_func_ret_number_1=func func_1(); # 1 +var test_func_ret_number_1 = func func_1(); # 1 var test_func_ret_number_2=func_1(); # 1 var source={ @@ -77,7 +77,7 @@ var source={ println(source['member_2']()); println(source.member_2()); -var test_func=func{return 1;} +var test_func = func {return 1;} println(func test_func()); # 1 println(test_func()); # 1 println(func test_func); # nothing @@ -87,9 +87,9 @@ println(({str:"what?"})["str"]); # what? println(({str:"what?"}).str); # what? # lambda -(func(x){return x>0? x:0;})(12); -(func{println("hello world");})(); -(((func(x){return 1.0/math.exp(x);})))(0); +(func(x) {return x>0? x:0;})(12); +(func {println("hello world");})(); +(((func(x) {return 1.0/math.exp(x);})))(0); # flexible definition & assignment var (r,g,b)=[0x00,0x10,0xff]; @@ -127,7 +127,7 @@ nil and 1+7*8; {num:0}.num or {what_is_the_secret_of_universe:42}["what_is_the_secret_of_universe"]; "123"~"456"-123456*2/2; -var hash={str:'hello',f:func{return me.str;}}; +var hash={str:'hello',f:func {return me.str;}}; var tmp_f=hash.f; hash=1; println(tmp_f()); @@ -136,16 +136,16 @@ println(tmp_f()); # when generating local_scope for function f, # nasal_gc will not count 'me' as one reference of this hash -var h1={str:'hello',f:func{return me.str;}}; -var h2={str:'world',f:func{return nil;}}; +var h1={str:'hello',f:func {return me.str;}}; +var h2={str:'world',f:func {return nil;}}; h2.f=h1.f; println(h2.f()); # print 'world' # this means that 'me' in hash's functions # only points to the hash this function belongs to -var f1=func(){println(1);return 1;} -var f2=func(){println(2);return 0;} +var f1 = func() {println(1);return 1;} +var f2 = func() {println(2);return 0;} f1() or f2(); # print '1' # this means that when using 'or' or 'and', @@ -158,12 +158,12 @@ print( abs(1),'\n', abs(-1),'\n', systime(),'\n', - isfunc(func{}),' ',isfunc([]),'\n', + isfunc(func {}),' ',isfunc([]),'\n', ishash({}),' ',ishash([]),'\n', isint(114.514),' ',isint(114514),'\n', isnum("0xaa55"),' ',isnum("?"),'\n', isscalar(0.618),' ',isscalar("hello"),' ',isscalar([]),'\n', - isstr("hello"),' ',isstr(func{}),'\n', + isstr("hello"),' ',isstr(func {}),'\n', isvec([]),' ',isvec("[]"),'\n', vecindex([0,1,2,3,4],1),'\n', vecindex(["apple","banana"],"apple")!=nil,'\n' @@ -179,13 +179,13 @@ println(find("x", "abcdef")); # prints -1 println(find("cd", "abcdef")); # prints 2 var a={ - new: func(x=0){ + new: func(x=0) { return { x:x, parents:[a] }; }, - new2: func(x=0){ + new2: func(x=0) { return { x:x, parents:a @@ -195,17 +195,17 @@ var a={ println(isa(a.new(),a)); # 1 println(isa(a.new2(),a));# 0 -var a=[10,-10,0,1,2,3,nil,"string","hello",[],[0,1,2,3],{},{a:0,b:1,c:2},func{}]; +var a=[10,-10,0,1,2,3,nil,"string","hello",[],[0,1,2,3],{},{a:0,b:1,c:2},func {}]; println("type\tsize\tnum\tsrc"); -foreach(var i;a){ +foreach(var i;a) { println(typeof(i),'\t',size(i),'\t',num(i),'\t',i); } -foreach(i;a){ +foreach(i;a) { ; } println(runtime.argv()); println(globals.arg); -func(a,b,c,d="只有红茶可以吗"){ +func(a,b,c,d="只有红茶可以吗") { println(a,' ',b,' ',c,' ',d,' true: ',true,' false: ',false); }(c:1919810,b:514,a:114); @@ -220,7 +220,7 @@ var h=split(" ","0 1 2 3 4 5 6 7 8 9 a b c d e f"); for(var a=0;a<16;a+=1) { for(var b=0;b<16;b+=1) { for(var c=0;c<16;c+=1) { - if(((a^b)&c)!=(a^(b&c))) { + if (((a^b)&c)!=(a^(b&c))) { println("0x"~h[a],"^","0x"~h[b],"&","0x"~h[c]," -> a^b&c = 0x",h[a^b&c]," (a^b)&c = 0x",h[(a^b)&c]," a^(b&c) = 0x",h[(a^(b&c))]); } } diff --git a/test/snake.nas b/test/snake.nas index 27babbb..dec06ff 100644 --- a/test/snake.nas +++ b/test/snake.nas @@ -1,13 +1,14 @@ use module.libkey; use std.list; use std.runtime; +use std.coroutine; -var game=func(x,y){ +var game = func(x,y) { rand(time(0)); var texture=[" ","██","\e[91m██\e[0m"]; var edge0="╔"; var edge1="╚"; - for(var i=0;i=0){ + if (move=="w" and fy-1>=0) { snake.push_front([fx,fy-1]); - if(vec[fx][fy-1]==1) + if (vec[fx][fy-1]==1) gameover=1; - elsif(vec[fx][fy-1]==2) + elsif (vec[fx][fy-1]==2) eat=1; vec[fx][fy-1]=1; - }elsif(move=='a' and fx-1>=0){ + } elsif (move=='a' and fx-1>=0) { snake.push_front([fx-1,fy]); - if(vec[fx-1][fy]==1) + if (vec[fx-1][fy]==1) gameover=1; - elsif(vec[fx-1][fy]==2) + elsif (vec[fx-1][fy]==2) eat=1; vec[fx-1][fy]=1; - }elsif(move=='s' and fy+1=0;i-=1){ +var exchange = func() { + for(var i=6;i>=0;i-=1) { var index=int(i*rand()); (package[i],package[index])=(package[index],package[i]); } @@ -74,12 +74,12 @@ var block={ type:nil, shape:nil, color:nil, - new:func(x=0,y=0){ + new:func(x=0,y=0) { (me.x,me.y)=(x,y); me.rotate=0; me.type=blocktype[package[counter]]; counter+=1; - if(counter==7){ + if (counter==7) { exchange(); counter=0; } @@ -88,18 +88,18 @@ var block={ me.color=color_count; color_count+=1; - if(color_count>=size(color)) + if (color_count>=size(color)) color_count=0; return {parents:[block]}; } }; -var mapgen=func(mapx,mapy){ +var mapgen = func(mapx,mapy) { var (score,gameover)=(0,0); var (empty,unset,full)=(0,1,2); - if(mapx<1 or mapy<1) + if (mapx<1 or mapy<1) die("map_x or map_y must be greater than 1"); # use in print @@ -111,7 +111,7 @@ var mapgen=func(mapx,mapy){ # generate new map var map=[]; - for(var y=0;y=full){ + if (map[blk.y+i[1]][blk.x+i[0]]>=full) { gameover=1; return; } @@ -135,17 +135,17 @@ var mapgen=func(mapx,mapy){ new_block(); # initialize the first block # color print - var map_print=func(){ + var map_print = func() { var s="\e[1;1H"~head; - for(var y=0;y=full) + elsif (c>=full) s~=color[c-full]~"██\e[0m"; } s~="\e[32m║\e[0m\n"; @@ -154,12 +154,12 @@ var mapgen=func(mapx,mapy){ print(s,"\e[31ms\e[32mc\e[33mo\e[34mr\e[35me\e[36m: \e[0m",score,'\n'); } - var moveleft=func(){ + var moveleft = func() { var (x,y)=(blk.x-1,blk.y); - foreach(var i;blk.shape){ - if(x+i[0]<0) + foreach(var i;blk.shape) { + if (x+i[0]<0) return; - if(map[y+i[1]][x+i[0]]>=full) + if (map[y+i[1]][x+i[0]]>=full) return; } # update block state and map @@ -171,12 +171,12 @@ var mapgen=func(mapx,mapy){ map_print(); } - var moveright=func(){ + var moveright = func() { var (x,y)=(blk.x+1,blk.y); - foreach(var i;blk.shape){ - if(x+i[0]>=mapx) + foreach(var i;blk.shape) { + if (x+i[0]>=mapx) return; - if(map[y+i[1]][x+i[0]]>=full) + if (map[y+i[1]][x+i[0]]>=full) return; } # update block state and map @@ -188,14 +188,14 @@ var mapgen=func(mapx,mapy){ map_print(); } - var rotate=func(){ + var rotate = func() { var (r,x,y)=(blk.rotate,blk.x,blk.y); r=(r+1>=size(blk.type))?0:r+1; var shape=blockshape[blk.type[r]]; - foreach(var i;shape){ - if(x+i[0]>=mapx or x+i[0]<0 or y+i[1]>=mapy or y+i[1]<0) + foreach(var i;shape) { + if (x+i[0]>=mapx or x+i[0]<0 or y+i[1]>=mapy or y+i[1]<0) return; - if(map[y+i[1]][x+i[0]]>=full) + if (map[y+i[1]][x+i[0]]>=full) return; } @@ -209,17 +209,17 @@ var mapgen=func(mapx,mapy){ map_print(); } - var fall=func(){ + var fall = func() { var (x,y)=(blk.x,blk.y+1); # check if falls to the edge of other blocks or map var sethere=0; foreach(var i;blk.shape) - if(y+i[1]>=mapy or map[y+i[1]][x+i[0]]>=full){ + if (y+i[1]>=mapy or map[y+i[1]][x+i[0]]>=full) { sethere=1; break; } # set block here and generate a new block - if(sethere){ + if (sethere) { foreach(var i;blk.shape) map[blk.y+i[1]][blk.x+i[0]]=blk.color+full; checkmap(); @@ -236,19 +236,19 @@ var mapgen=func(mapx,mapy){ map_print(); } - var checkmap=func(){ + var checkmap = func() { var lines=1; - for(var y=mapy-1;y>=0;y-=1){ + for(var y=mapy-1;y>=0;y-=1) { # check if this line is full of blocks var tmp=0; - for(var x=0;x=1;t-=1) @@ -268,15 +268,15 @@ var mapgen=func(mapx,mapy){ rotate:rotate, fall:fall, checkmap:checkmap, - gameover:func(){return gameover;} + gameover:func() {return gameover;} }; } -var main=func(argv){ +var main = func(argv) { var should_skip=(size(argv)!=0 and argv[0]=="--skip"); var init_counter=should_skip?5:30; # windows use chcp 65001 to output unicode - if(os.platform()=="windows") + if (os.platform()=="windows") system("chcp 65001"); print( @@ -296,41 +296,41 @@ var main=func(argv){ exchange(); var map=mapgen(mapx:12,mapy:18); - if(!should_skip){ + if (!should_skip) { libkey.getch(); } print("\ec"); map.print(); var counter=init_counter; - while(1){ + while(1) { # nonblock input one character var ch=libkey.nonblock(); - if(ch){ - if(ch=='a'[0]) # move left + if (ch) { + if (ch=='a'[0]) # move left map.moveleft(); - elsif(ch=='d'[0]) # move right + elsif (ch=='d'[0]) # move right map.moveright(); - elsif(ch=='w'[0]) # rotate + elsif (ch=='w'[0]) # rotate map.rotate(); - elsif(ch=='s'[0]) # move down + elsif (ch=='s'[0]) # move down map.fall(); - elsif(ch=='q'[0]) # quit the game + elsif (ch=='q'[0]) # quit the game break; - if(ch=='p'[0]){ # pause the game + if (ch=='p'[0]) { # pause the game print("\rpress any key to continue..."); libkey.getch(); print("\r "); } map.checkmap(); - if(map.gameover()) + if (map.gameover()) break; } - if(!counter){ + if (!counter) { # automatically fall one block and check map.fall(); map.checkmap(); - if(map.gameover()) + if (map.gameover()) break; counter=init_counter; } @@ -348,7 +348,7 @@ var main=func(argv){ "\e[36m'\e[94mq\e[95m' ", "\e[35mt\e[36mo \e[94mq\e[95mu\e[91mi\e[92mt\e[0m\n" ); - if(!should_skip){ + if (!should_skip) { while(libkey.getch()!='q'[0]); } }; diff --git a/test/trait.nas b/test/trait.nas index 5bda73d..5e0224b 100644 --- a/test/trait.nas +++ b/test/trait.nas @@ -1,11 +1,11 @@ var trait={ - get:func{return me.val;}, - set:func(x){me.val=x;} + get:func {return me.val;}, + set:func(x) {me.val=x;} }; var class={ - new:func(){ + new:func() { return { val:nil, parents:[trait] @@ -14,25 +14,25 @@ var class={ }; var class2={ - new:func(){ + new:func() { return { val:nil, parents:[trait], - set:func(x){me.val=typeof(x);} + set:func(x) {me.val=typeof(x);} }; } }; var class_obj=[]; -for(var i=0;i<10;i+=1){ +for(var i=0;i<10;i+=1) { append(class_obj,class.new()); class_obj[i].set(i); } -for(var i=0;i<10;i+=1){ +for(var i=0;i<10;i+=1) { append(class_obj,class2.new()); class_obj[10+i].set(i); } -foreach(var object;class_obj){ +foreach(var object;class_obj) { println(object.get(),' ',keys(object)); } \ No newline at end of file diff --git a/test/turingmachine.nas b/test/turingmachine.nas index 95dea5d..e3ac15f 100644 --- a/test/turingmachine.nas +++ b/test/turingmachine.nas @@ -8,8 +8,8 @@ var table=[ ]; var operand={ - new:func(symbol,changed_symbol,move,next_state){ - if(move!='L' and move!='R' and move!='S') + new:func(symbol,changed_symbol,move,next_state) { + if (move!='L' and move!='R' and move!='S') die("invalid move type:"+move); return { symbol:symbol, @@ -22,27 +22,27 @@ var operand={ var machine={ states:{}, - add:func(state,operand){ - if(!contains(me.states,state)) + add:func(state,operand) { + if (!contains(me.states,state)) me.states[state]=[operand]; - else{ + else { foreach(var i;me.states[state]) - if(i.symbol==operand.symbol or i.symbol==nil){ + if (i.symbol==operand.symbol or i.symbol==nil) { println(i); die("conflict operand"); } append(me.states[state],operand); } }, - load:func(data){ - foreach(var opr;data){ + load:func(data) { + foreach(var opr;data) { var (nstat,sym,csym,move,nextstat)=opr; me.add(nstat,operand.new(sym,csym,move,nextstat)); } } }; -var prt=func(state,pointer,paper,act=nil){ +var prt = func(state,pointer,paper,act=nil) { print(act!=nil?act:'','\n\t'); var s=''; foreach(var i;paper) @@ -53,43 +53,43 @@ var prt=func(state,pointer,paper,act=nil){ s~=' '; print(s,'^\n',state," "); } -var run=func(table,start,stop){ +var run = func(table,start,stop) { var paper=['0','1','1','1','0','1','0','a']; var pointer=0; machine.load(table); print("states: ",keys(machine.states),'\n'); - if(!contains(machine.states,start)) + if (!contains(machine.states,start)) die(start~" is not a valid node"); - if(!contains(machine.states,stop)) + if (!contains(machine.states,stop)) die(stop~" is not a valid node"); var (state,pointer)=(start,0); prt(state,pointer,paper); - while(state!=stop){ - if(!contains(machine.states,state)) + while(state!=stop) { + if (!contains(machine.states,state)) die("no matching function for state:"~state); var found=0; - foreach(var action;machine.states[state]){ + foreach(var action;machine.states[state]) { var (sym,csym,move,next)=( action.symbol, action.changed_symbol, action.move, action.next_state ); - if(sym==paper[pointer] or sym==nil){ - if(sym!=nil) + if (sym==paper[pointer] or sym==nil) { + if (sym!=nil) paper[pointer]=csym; - if(move=='L') pointer-=1; - elsif(move=='R') pointer+=1; + if (move=='L') pointer-=1; + elsif (move=='R') pointer+=1; (state,found)=(next,1); break; } } - if(!found) + if (!found) die("no matching function for state:"~state); prt(state,pointer,paper,[sym,csym,move,next]); diff --git a/test/utf8chk.nas b/test/utf8chk.nas index 37ee852..ff2b445 100644 --- a/test/utf8chk.nas +++ b/test/utf8chk.nas @@ -1,4 +1,4 @@ -var unicode测试=func(){ +var unicode测试 = func() { var 输出=print; var 测试成功=[ "unicode: utf-8支持测试成功", @@ -9,7 +9,7 @@ var unicode测试=func(){ 输出(内容~"\n"); } -var emoji测试=func(){ +var emoji测试 = func() { var 💻=print; var 🎤="\n"; var 🤣="🤣 笑嘻了"; @@ -47,21 +47,21 @@ var emoji测试=func(){ 💻(📄,🗄️[📄],🎤); } -var dotsgen=func(){ +var dotsgen = func() { var dots=[]; var s="⠀"; - for(var i=0;i<256;i+=1){ + for(var i=0;i<256;i+=1) { var v0=s[0]; var v1=s[1]+int(i/64); var v2=s[2]+i; - if(v2>191){ + if (v2>191) { v2-=int(i/64)*64; } var tmp=char(v0)~char(v1)~char(v2); append(dots,tmp); } - forindex(var i;dots){ + forindex(var i;dots) { print(dots[i],(i+1-int((i+1)/32)*32==0)?"\n":""); } return dots; diff --git a/test/watchdog.nas b/test/watchdog.nas index f89c59a..1cb53a0 100644 --- a/test/watchdog.nas +++ b/test/watchdog.nas @@ -1,50 +1,50 @@ use std.runtime; -var os_time=func(){ +var os_time = func() { return "[\e[33;1m"~os.time()~"\e[0m] "; } -var err_hd=func(){ +var err_hd = func() { return "[\e[91;1merror\e[0m] "; } -var info_hd=func(){ +var info_hd = func() { return "[\e[96;1minfo\e[0m] "; } -var modified_hd=func(){ +var modified_hd = func() { return "[\e[92;1mmodified\e[0m] "; } -var usage=func(){ +var usage = func() { println(os_time(),info_hd(),"\e[1musage: nasal watchdog.nas [\"argv\"]\e[0m"); } var argv=runtime.argv(); -if(size(argv)<1){ +if (size(argv)<1) { println(os_time(),err_hd(),"\e[1mneed correct file path to watch\e[0m"); usage(); exit(-1); } var filename=argv[0]; -if(!io.exists(filename)){ +if (!io.exists(filename)) { println(os_time(),err_hd(),"\e[1mfile <",filename,"> does not exist\e[0m"); usage(); exit(-1); } var args=[]; -if(size(argv)==2){ +if (size(argv)==2) { println(os_time(),info_hd(),"\e[1mwith argument(s) ",argv[1],"\e[0m"); args=split(" ",argv[1]); } var modified_time=fstat(filename).st_mtime; println(os_time(),info_hd(),"\e[1mwatching ",filename," ..\e[0m"); -while(1){ +while(1) { unix.sleep(1); - if(!io.exists(filename)){ + if (!io.exists(filename)) { println(os_time(),err_hd(),"\e[1mfile <",filename,"> does not exist\e[0m"); break; } var latest_modified_time=fstat(filename).st_mtime; - if(latest_modified_time!=modified_time){ + if (latest_modified_time!=modified_time) { modified_time=latest_modified_time; println(os_time(),modified_hd(),"\e[1m",filename,"\e[0m"); var cmd=(os.platform()=="windows"?"":"./")~"nasal "~filename; @@ -52,9 +52,9 @@ while(1){ cmd~=" "~i; println(os_time(),info_hd(),"\e[1mexecuting command \"",cmd,"\"\e[0m"); var ret=system(cmd); - if(ret!=0){ + if (ret!=0) { println(os_time(),err_hd(),"\e[1mprocess returned ",ret,"\e[0m"); - }else{ + } else { println(os_time(),info_hd(),"\e[1mprocess returned ",ret,"\e[0m"); } } diff --git a/test/wavecollapse.nas b/test/wavecollapse.nas index 556f9e3..1cdbf90 100644 --- a/test/wavecollapse.nas +++ b/test/wavecollapse.nas @@ -27,35 +27,35 @@ var table=[ [" ",0,0,0,0] ]; -var map=func(){ +var map = func() { var (vec,x,s)=(nil,nil,size(table)); - var generator=func(){ + var generator = func() { var tmp=[]; foreach(var elem;table) - if(elem[1]==vec[0][0][3] and elem[2]==0) + if (elem[1]==vec[0][0][3] and elem[2]==0) append(tmp,elem); vec[1][0]=tmp[rand()*size(tmp)]; - for(var j=1;j0.5){ + for(var j=1;j0.5) { vec[1][j]=table[-1]; continue; } tmp=[]; foreach(var elem;table) - if(elem[2]==vec[1][j-1][4] and elem[1]==vec[0][j][3]){ - if((j==x-1 and elem[4]==0) or j"); all_exists=0; } } - if(!all_exists){ + if (!all_exists) { exit(-1); } var file_content=""; foreach(var f;argv) file_content~=io.readfile(f)~" "; var vec=keys(spliter(file_content)); - sort(vec,func(a,b){return cmp(a,b)<=0;}); + sort(vec,func(a,b) {return cmp(a,b)<=0;}); println(vec); }(runtime.argv()); \ No newline at end of file diff --git a/test/ycombinator.nas b/test/ycombinator.nas index 0efe447..d795988 100644 --- a/test/ycombinator.nas +++ b/test/ycombinator.nas @@ -1,15 +1,16 @@ # Y combinator by ValKmjolnir -var fib=func(f){ +var fib = func(f) { return f(f); }( - func(f){ - return func(x){ - if(x<2) return x; - var tmp=f(f); + func(f) { + return func(x) { + if (x<2) return x; + var tmp = f(f); return tmp(x-1)+tmp(x-2); } } ); -for(var i=1;i<31;i+=1) +for(var i = 1; i<31; i += 1) { println(fib(i)); +} diff --git a/tools/andy_gc_test.nas b/tools/andy_gc_test.nas index 6960304..3b62316 100644 --- a/tools/andy_gc_test.nas +++ b/tools/andy_gc_test.nas @@ -20,40 +20,40 @@ func { } for(var i=0; i/dev/null 2>/dev/null")!=0) { + println("\e[31merror\e[0m ", dir_name, "/", k); + append(res, dir_name~"/"~k); + } + println("compiling ", dir_name, "/", k, " in \e[32m", ts.elapsedMSec(), "\e[0m ms"); + } + return res; +} + +var result = [ + check("./std"), + check("./module"), + check("./tools"), + check("./test") +]; +println(); +foreach(var i; result) { + foreach(var j; i) { + println("\e[31merror\e[0m ", j); + } +} \ No newline at end of file diff --git a/tools/push.nas b/tools/push.nas index 51c45d3..c4c1a60 100644 --- a/tools/push.nas +++ b/tools/push.nas @@ -1,9 +1,9 @@ -println("[",os.time(),"] (=.=) auto push, please wait..."); +println("[", os.time(), "] (=.=) auto push, please wait..."); while(system("git push")!=0) { - println("[",os.time(),"] (ToT) failed to push, retrying..."); + println("[", os.time(), "] (ToT) failed to push, retrying..."); unix.sleep(0.5); } -println("[",os.time(),"] (^o^) auto push complete."); +println("[", os.time(), "] (^o^) auto push complete.");