From 28a42346b76fb75fdc73fc62c4ccbf0e32dc3f3b Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Thu, 16 Nov 2023 23:19:03 +0800 Subject: [PATCH] :memo: update scripts --- doc/benchmark.md | 12 ++ doc/nasal-http-test-web.html | 4 +- doc/pic/mandelbrotset.png | Bin 0 -> 165579 bytes module/libfib.nas | 2 +- module/libkey.nas | 6 +- std/csv.nas | 6 +- std/dylib.nas | 22 ++-- std/fg_env.nas | 175 +++++++++++++------------ std/file.nas | 15 ++- std/json.nas | 8 +- std/lib.nas | 11 +- std/list.nas | 2 +- std/log.nas | 22 ++-- std/mat.nas | 46 +++---- std/module.nas | 33 ++--- std/process_bar.nas | 172 ++++++++++++------------ std/props.nas | 120 ++++++++--------- std/queue.nas | 24 ++-- std/string.nas | 2 +- std/udp.nas | 4 +- std/unix.nas | 1 + test/ascii-art.nas | 34 ++--- test/auto_crash.nas | 28 ++-- test/bf.nas | 42 +++--- test/bfconvertor.nas | 44 +++---- test/bfs.nas | 20 +-- test/bp.nas | 48 +++---- test/calc.nas | 30 ++--- test/choice.nas | 12 +- test/class.nas | 22 ++-- test/console3D.nas | 88 ++++++------- test/coroutine.nas | 43 +++--- test/datalog.nas | 22 ++-- test/diff.nas | 46 +++---- test/donuts.nas | 16 +-- test/exception.nas | 14 +- test/feigenbaum.nas | 3 +- test/fib.nas | 6 +- test/filesystem.nas | 18 +-- test/hexdump.nas | 36 ++--- test/httptest.nas | 172 ++++++++++++------------ test/json.nas | 4 +- test/jsonrpc.nas | 16 +-- test/leetcode1319.nas | 17 ++- test/lexer.nas | 105 ++++++++------- test/life.nas | 64 ++++----- test/loop.nas | 12 +- test/mandelbrot.nas | 8 +- test/{ppmgen.nas => mandelbrotset.nas} | 0 test/mcpu.nas | 78 +++++------ test/md5_self.nas | 68 +++++----- test/md5compare.nas | 6 +- test/module_test.nas | 28 ++-- test/nasal_test.nas | 26 ++-- test/occupation.nas | 77 +++++------ test/prime.nas | 22 ++-- test/qrcode.nas | 4 +- test/quick_sort.nas | 18 +-- test/sample.nas | 30 ++--- test/scalar.nas | 50 +++---- test/snake.nas | 84 ++++++------ test/tetris.nas | 104 +++++++-------- test/trait.nas | 16 +-- test/turingmachine.nas | 40 +++--- test/utf8chk.nas | 12 +- test/watchdog.nas | 26 ++-- test/wavecollapse.nas | 34 ++--- test/word_collector.nas | 34 ++--- test/ycombinator.nas | 13 +- tools/andy_gc_test.nas | 60 ++++----- tools/compiling_test.nas | 29 ++++ tools/push.nas | 6 +- 72 files changed, 1285 insertions(+), 1237 deletions(-) create mode 100644 doc/pic/mandelbrotset.png rename test/{ppmgen.nas => mandelbrotset.nas} (100%) create mode 100644 tools/compiling_test.nas 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 0000000000000000000000000000000000000000..a6b541d9e62b3f455eaf7bfb4cfaa0a3d87f6716 GIT binary patch literal 165579 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

      jaH5d7R|Hr6NxDPo^8p%PI)h=S`@7Z1 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%0DlMgV^{v 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

      O4DI?~cS2EI-jqHFw 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 VG: "~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.");