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:

+
+## More nasal generated pictures
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/nasal-http-test-web.html b/doc/nasal-http-test-web.html
index d2c2e83..e452a00 100644
--- a/doc/nasal-http-test-web.html
+++ b/doc/nasal-http-test-web.html
@@ -128,10 +128,10 @@
lexer.nas
life.nas
loop.nas
- mandel.nas
mandelbrot.nas
+ mandelbrotset.nas
mcpu.nas
- md5.nas
+ md5_self.nas
md5compare.nas
diff --git a/doc/pic/mandelbrotset.png b/doc/pic/mandelbrotset.png
new file mode 100644
index 0000000..a6b541d
Binary files /dev/null and b/doc/pic/mandelbrotset.png differ
diff --git a/module/libfib.nas b/module/libfib.nas
index a42ed9b..18819a7 100644
--- a/module/libfib.nas
+++ b/module/libfib.nas
@@ -44,7 +44,7 @@ var print_ghost = func(object) {
}
-var test_ghost=func() {
+var test_ghost = func() {
var ghost = create_ghost();
print_ghost(nil); # err
print_ghost(ghost); # random
diff --git a/module/libkey.nas b/module/libkey.nas
index 829e99c..564266b 100644
--- a/module/libkey.nas
+++ b/module/libkey.nas
@@ -11,8 +11,8 @@ var (
var nb = lib.nas_noblock;
var call = dylib.limitcall(0);
return [
- func(){return call(kb);},
- func(){return call(gt);},
- func(){return call(nb);}
+ func() {return call(kb);},
+ func() {return call(gt);},
+ func() {return call(nb);}
];
}();
diff --git a/std/csv.nas b/std/csv.nas
index 94800a9..7423360 100644
--- a/std/csv.nas
+++ b/std/csv.nas
@@ -1,12 +1,12 @@
# lib csv.nas
# ValKmjolnir 2022/10/15
-var read = func(path, delimeter=",", endline="\n"){
+var read = func(path, delimeter=",", endline="\n") {
var context = io.readfile(path);
context = split(endline, context);
- forindex(var i;context){
+ forindex(var i;context) {
context[i] = split(delimeter,context[i]);
}
- if(size(context)<=1){
+ if (size(context)<=1) {
die("incorrect csv file <"~path~">: "~size(context)~" line(s).");
}
return {
diff --git a/std/dylib.nas b/std/dylib.nas
index f65c397..92f5bcf 100644
--- a/std/dylib.nas
+++ b/std/dylib.nas
@@ -7,7 +7,7 @@
var dlopen = func(libname) {
# find dynamic lib from local dir first
libname = (os.platform()=="windows"? ".\\":"./")~libname;
- if(io.exists(libname))
+ if (io.exists(libname))
return __dlopen(libname);
# find dynamic lib through PATH
var envpath = split(os.platform()=="windows"? ";":":",unix.getenv("PATH"));
@@ -16,7 +16,7 @@ var dlopen = func(libname) {
var path = os.platform()=="windows"? "\\module\\":"/module/";
foreach(var p;envpath) {
p ~= path~libname;
- if(io.exists(p)) {
+ if (io.exists(p)) {
libname = p;
break;
}
@@ -37,14 +37,14 @@ var dlcall = func(ptr, args...) {
# get dlcall function with limited parameter list
var limitcall = func(arg_size = 0) {
- if(arg_size==0) {return func(ptr) {return __dlcall};}
- elsif(arg_size==1) {return func(ptr, _0) {return __dlcall};}
- elsif(arg_size==2) {return func(ptr, _0, _1) {return __dlcall};}
- elsif(arg_size==3) {return func(ptr, _0, _1, _2) {return __dlcall};}
- elsif(arg_size==4) {return func(ptr, _0, _1, _2, _3) {return __dlcall};}
- elsif(arg_size==5) {return func(ptr, _0, _1, _2, _3, _4) {return __dlcall};}
- elsif(arg_size==6) {return func(ptr, _0, _1, _2, _3, _4, _5) {return __dlcall};}
- elsif(arg_size==7) {return func(ptr, _0, _1, _2, _3, _4, _5, _6) {return __dlcall};}
- elsif(arg_size==8) {return func(ptr, _0, _1, _2, _3, _4, _5, _6, _7) {return __dlcall};}
+ if (arg_size==0) {return func(ptr) {return __dlcall};}
+ elsif (arg_size==1) {return func(ptr, _0) {return __dlcall};}
+ elsif (arg_size==2) {return func(ptr, _0, _1) {return __dlcall};}
+ elsif (arg_size==3) {return func(ptr, _0, _1, _2) {return __dlcall};}
+ elsif (arg_size==4) {return func(ptr, _0, _1, _2, _3) {return __dlcall};}
+ elsif (arg_size==5) {return func(ptr, _0, _1, _2, _3, _4) {return __dlcall};}
+ elsif (arg_size==6) {return func(ptr, _0, _1, _2, _3, _4, _5) {return __dlcall};}
+ elsif (arg_size==7) {return func(ptr, _0, _1, _2, _3, _4, _5, _6) {return __dlcall};}
+ elsif (arg_size==8) {return func(ptr, _0, _1, _2, _3, _4, _5, _6, _7) {return __dlcall};}
else {return func(ptr, args...) {return __dlcallv};}
}
\ No newline at end of file
diff --git a/std/fg_env.nas b/std/fg_env.nas
index 0479a35..bba128a 100644
--- a/std/fg_env.nas
+++ b/std/fg_env.nas
@@ -1,6 +1,7 @@
# flightgear developer environments simulator (beta)
# ValKmjolnir 2022
use std.runtime;
+use std.coroutine;
println("-------------------------------------------------------------");
println(" FlightGear simulated-env for developers project, since 2019");
@@ -15,8 +16,8 @@ var fg_env_cli={
"--fg-env-help":{
info:"get help",
trigger:0,
- f:func{
- if(me.trigger)
+ f:func {
+ if (me.trigger)
return;
println("-------------------------------------------------------------");
println(" Help:");
@@ -29,8 +30,8 @@ var fg_env_cli={
"--fg-env-debug":{
info:"get property tree structure",
trigger:0,
- f:func{
- if(me.trigger)
+ f:func {
+ if (me.trigger)
return;
props.globals.debug();
me.trigger=1;
@@ -39,8 +40,8 @@ var fg_env_cli={
"--fg-env-mktmtest":{
info:"test maketimer",
trigger:0,
- f:func{
- if(me.trigger)
+ f:func {
+ if (me.trigger)
return;
maketimer_multi_coroutine_test(32);
me.trigger=1;
@@ -57,8 +58,8 @@ var fg_globals={
};
println("[\e[32m maketimer \e[0m] [",os.time(),"] new func add_event(name,interval,function)");
-var add_event=func(name,interval,function){
- fg_globals.event[name]=coroutine.create(func{
+var add_event = func(name,interval,function) {
+ fg_globals.event[name]=coroutine.create(func {
var timestamp=maketimestamp();
timestamp.stamp();
while(timestamp.elapsedMSec()0){
- if(contains(tmp.val,path[i]~'['~index~']'))
+ if (path_size>0) {
+ if (contains(tmp.val,path[i]~'['~index~']'))
return tmp.val[path[i]~'['~index~']'];
else
return tmp.val[path[i]];
@@ -238,89 +239,89 @@ var props={
println("[\e[32m props \e[0m] [",os.time(),"] init props.Node");
props.Node={
- new:func(values=nil){
+ new:func(values=nil) {
var res={
parents:fg_env_props_node_traits,
val:{},
type:'GHOST',
parent:nil
};
- if(typeof(values)=="hash")
+ if (typeof(values)=="hash")
res.val=values;
return res;
},
- addChild:func(name){
- if(!contains(me.val,name)){
+ addChild:func(name) {
+ if (!contains(me.val,name)) {
me.val[name]=props.Node.new();
me.val[name].parent=me;
return 1;
}
return 0;
},
- addChildren:func(name,cnt=0){
- for(var i=0;i1 and in_vec(tmp[-1])) {
append(res, f);
@@ -48,16 +48,17 @@ var find_all_files_with_extension = func(path, extensions...){
return res;
}
-var find_all_files = func(path){
+var find_all_files = func(path) {
if (!io.exists(path)) {
return [];
}
var dd = unix.opendir(path);
var res = [];
- while(var n = unix.readdir(dd))
- if(unix.isfile(path~"/"~n)) {
+ while(var n = unix.readdir(dd)) {
+ if (unix.isfile(path~"/"~n)) {
append(res, n);
}
+ }
unix.closedir(dd);
return res;
}
diff --git a/std/json.nas b/std/json.nas
index 7cf97b9..8aab185 100644
--- a/std/json.nas
+++ b/std/json.nas
@@ -93,7 +93,7 @@ var parse = func() {
}
ptr += 1;
}
- if(ptr>=text_size) {
+ if (ptr>=text_size) {
token.content = "eof";
token.type = _j_eof;
return;
@@ -167,7 +167,7 @@ var parse = func() {
}
var match = func(type) {
- if(token.type!=type) {
+ if (token.type!=type) {
println("json::parse: line ",line,": expect ",_j_content[type]," but get `",token.content,"`.");
_parse_error += 1;
}
@@ -237,7 +237,7 @@ var parse = func() {
return func(source) {
_parse_error = 0;
- if(typeof(source)!="str") {
+ if (typeof(source)!="str") {
println("json::parse: must use string but get", typeof(str));
_parse_error += 1;
return [];
@@ -260,7 +260,7 @@ var parse = func() {
var stringify = func(object) {
_parse_error = 0;
var object_type = typeof(object);
- if(object_type!="hash" and object_type!="vec" and object_type!="namespace") {
+ if (object_type!="hash" and object_type!="vec" and object_type!="namespace") {
_parse_error += 1;
println("json::stringify: must use hashmap or vector, but get ", typeof(object));
return "[]";
diff --git a/std/lib.nas b/std/lib.nas
index ce2afef..09b4680 100644
--- a/std/lib.nas
+++ b/std/lib.nas
@@ -1,12 +1,9 @@
# lib.nas
# 2019 ValKmjolnir
-
-use std.coroutine;
use std.math;
use std.string;
use std.io;
use std.os;
-use std.bits;
use std.unix;
# print is used to print all things in nasal, try and see how it works.
@@ -235,7 +232,7 @@ var println = func(elems...) {
var sort = func() {
srand(); # be aware! this causes global changes
var quick_sort_core = func(vec, left, right, cmp) {
- if(left>=right) return nil;
+ if (left>=right) return nil;
var base = left+int(rand()*(right-left));
(vec[left], vec[base]) = (vec[base], vec[left]);
var (i, j, tmp) = (left, right, vec[left]);
@@ -301,7 +298,7 @@ var ghosttype = func(ghost_object) {
# get the index of val in the vec
var vecindex = func(vec, val) {
forindex(var i; vec) {
- if(val==vec[i]) {
+ if (val==vec[i]) {
return i;
}
}
@@ -313,11 +310,11 @@ var isa = func(object, class) {
if (!ishash(object)) {
return false;
}
- if(!contains(object, "parents") or !isvec(object.parents)) {
+ if (!contains(object, "parents") or !isvec(object.parents)) {
return false;
}
foreach(var elem; object.parents) {
- if(elem==class or isa(elem, class)) {
+ if (elem==class or isa(elem, class)) {
return true;
}
}
diff --git a/std/list.nas b/std/list.nas
index 2b70bd7..3c1aca3 100644
--- a/std/list.nas
+++ b/std/list.nas
@@ -10,7 +10,7 @@ var new = func() {
prev: nil,
next: nil
};
- if(end!=nil) {
+ if (end!=nil) {
end.next = tmp;
tmp.prev = end;
end = tmp;
diff --git a/std/log.nas b/std/log.nas
index b89f164..ce22517 100644
--- a/std/log.nas
+++ b/std/log.nas
@@ -1,18 +1,18 @@
# log.nas
# ValKmjolnir 2022/6/14
-var log=func(){
+var log = func() {
var (log_date,log_time,prefix)=(1,1,"");
var os_time="";
- var prt_core=func(elem){
+ var prt_core = func(elem) {
os_time=os.time();
print(prefix," ");
- if(log_date and log_time)
+ if (log_date and log_time)
print(os_time," ");
- elsif(log_date or log_time){
+ elsif (log_date or log_time) {
var s=split(" ",os_time);
- if(log_date)
+ if (log_date)
print(s[0]," ");
- if(log_time)
+ if (log_time)
print(s[1]," ");
}
foreach(var i;elem)
@@ -20,19 +20,19 @@ var log=func(){
print("\n");
}
return {
- setflags:func(date,time){
+ setflags:func(date,time) {
log_date=!!date;
log_time=!!time;
},
- setprefix:func(s){
- if(typeof(s)!="str")
+ setprefix:func(s) {
+ if (typeof(s)!="str")
println("[log.nas] must use string as the prefix.");
prefix=s;
},
- println:func(elem...){
+ println:func(elem...) {
prt_core(elem);
},
- fatalln:func(elem...){
+ fatalln:func(elem...) {
prt_core(elem);
die("log:fatal error");
}
diff --git a/std/mat.nas b/std/mat.nas
index 3c52e9a..42289c9 100644
--- a/std/mat.nas
+++ b/std/mat.nas
@@ -1,5 +1,5 @@
-var mat=func(width,height) {
+var mat = func(width,height) {
var res=[];
setsize(res,width*height);
forindex(var i;res) {
@@ -12,14 +12,14 @@ var mat=func(width,height) {
};
}
-var rand_init=func(a) {
+var rand_init = func(a) {
var ref=a.mat;
forindex(var i;ref) {
ref[i]=rand()*2-1;
}
}
-var mat_print=func(a) {
+var mat_print = func(a) {
var (width,height,ref)=(a.width,a.height,a.mat);
for(var i=0;i0.001) {
epoch+=1;
- if(epoch>1e4) {
+ if (epoch>1e4) {
println("Training failed after ",epoch," epoch.");
break;
}
@@ -248,7 +248,7 @@ var bp_example=func() {
total+=sum(mult_num(mult(error,trans(error)),0.5));
}
}
- if(epoch<=1e4) {
+ if (epoch<=1e4) {
println("Training succeeded after ",epoch," epoch.");
}
diff --git a/std/module.nas b/std/module.nas
index bdb2888..5c03059 100644
--- a/std/module.nas
+++ b/std/module.nas
@@ -4,35 +4,36 @@
# this provides safe usage of dylib
# when dylib is closed,
# all the invalid functions cannot be called
+use std.dylib;
-var module_call_func=func(fptr,args){
+var module_call_func = func(fptr, args) {
return __dlcallv;
}
-var extern={
- new: func(fptr){
- var isopen=1;
+var extern = {
+ new: func(fptr) {
+ var isopen = 1;
return {
- close:func(){isopen=0;},
- call:func(args...){
+ close: func() {isopen = 0;},
+ call: func(args...) {
return isopen?module_call_func(fptr,args):nil;
}
};
}
};
-var module={
- new: func(name){
- var lib=dylib.dlopen(name);
- var f={};
+var module = {
+ new: func(name) {
+ var lib = dylib.dlopen(name);
+ var f = {};
return {
- get:func(symbol){
- if(contains(f,symbol))
+ get: func(symbol) {
+ if (contains(f,symbol))
return f[symbol];
- var fp=extern.new(dylib.dlsym(lib,symbol));
- f[symbol]=fp;
+ var fp = extern.new(dylib.dlsym(lib,symbol));
+ f[symbol] = fp;
return fp;
},
- close: func(){
- foreach(var i;keys(f))
+ close: func() {
+ foreach(var i; keys(f))
f[i].close();
dylib.dlclose(lib);
}
diff --git a/std/process_bar.nas b/std/process_bar.nas
index ae05498..cac9f07 100644
--- a/std/process_bar.nas
+++ b/std/process_bar.nas
@@ -2,49 +2,49 @@
# ValKmjolnir 2022/6/14
# this file is inspired by a Python lib: alive_progress
-var bar=func(){
- var bar={
- solid_triangle_right:"▶",
- hollow_triangle_right:"▷",
- solid_triangle_left:"◀",
- hollow_triangle_left:"◁",
- solid_circle:"●",
- hollow_circle:"○",
- tick:"✔",
- cross:"✘",
- light_shadow:"░",
- medium_shadow:"▒",
- deep_shadow:"▓",
- block:"█",
- sharp:"#",
- square:"√",
- equal:"=",
- space:" ",
- point:".",
- line:"━"
+var bar = func() {
+ var bar = {
+ solid_triangle_right: "▶",
+ hollow_triangle_right: "▷",
+ solid_triangle_left: "◀",
+ hollow_triangle_left: "◁",
+ solid_circle: "●",
+ hollow_circle: "○",
+ tick: "✔",
+ cross: "✘",
+ light_shadow: "░",
+ medium_shadow: "▒",
+ deep_shadow: "▓",
+ block: "█",
+ sharp: "#",
+ square: "√",
+ equal: "=",
+ space: " ",
+ point: ".",
+ line: "━"
};
- var separator={
- angle_bracket:["<",">"],
- line:["|","|"],
- bracket:["[","]"],
- space:[" "," "],
- curve:["(",")"]
+ var separator = {
+ angle_bracket: ["<",">"],
+ line: ["|","|"],
+ bracket: ["[","]"],
+ space: [" "," "],
+ curve: ["(",")"]
};
- return func(front="sharp",back="space",sep="line",length=20){
- if(typeof(front)!="str" or !contains(bar,front))
+ return func(front = "sharp", back = "space", sep = "line", length = 20) {
+ if (typeof(front)!="str" or !contains(bar,front))
front="sharp";
- if(typeof(back)!="str" or !contains(bar,back))
+ if (typeof(back)!="str" or !contains(bar,back))
back="space";
- if(typeof(sep)!="str" or !contains(separator,sep))
+ if (typeof(sep)!="str" or !contains(separator,sep))
sep="line";
front=bar[front];
back=bar[back];
sep=separator[sep];
return {
- bar:func(number){
- if(number>1)
+ bar: func(number) {
+ if (number>1)
number=1;
- if(number<0)
+ if (number<0)
number=0;
var finish_length=int(number*length);
var other=length-finish_length;
@@ -62,32 +62,32 @@ var bar=func(){
# return a high resolution progress bar
# example:
# var bar=process_bar.high_resolution_bar(40);
-# for(var i=0;i<=1;i+=0.001){
+# for(var i=0;i<=1;i+=0.001) {
# print(bar.bar(i,40),'\r');
# unix.sleep(0.001);
# }
# println();
-var high_resolution_bar=func(){
+var high_resolution_bar = func() {
var block=["▏","▎","▍","▌","▋","▊","▉","█"];
- return func(length){
+ return func(length) {
return {
- bar: func(number){
- if(number>1)
+ bar: func(number) {
+ if (number>1)
number=1;
- if(number<0)
+ if (number<0)
number=0;
var block_len=number*length;
var complete_block=int(block_len);
var decimal=block_len-complete_block;
var progress=complete_block+(decimal!=0);
var s="|";
- for(var i=0;i16)
+ if (size(s)>16)
s="****";
var vec=split("",s);
var res=[];
var len=size(vec);
var tmp="";
- for(var i=0;i=size(type))
+ if (counter>=size(type))
counter=0;
return s;
}
@@ -236,71 +236,71 @@ var spinner=func(){
};
}();
-var default_bar=func(name="classic",length=20){
- if(typeof(name)!="str")
+var default_bar = func(name = "classic", length = 20) {
+ if (typeof(name)!="str")
name="classic";
- if(name=="classic")
+ if (name=="classic")
return process_bar.bar("sharp","point","bracket",length);
- elsif(name=="classic2")
+ elsif (name=="classic2")
return process_bar.bar("equal","point","bracket",length);
- elsif(name=="classic3")
+ elsif (name=="classic3")
return process_bar.bar("sharp","point","line",length);
- elsif(name=="classic4")
+ elsif (name=="classic4")
return process_bar.bar("equal","point","line",length);
- elsif(name=="triangle")
+ elsif (name=="triangle")
return process_bar.bar("solid_triangle_right","hollow_triangle_right","angle_bracket",length);
- elsif(name=="dots")
+ elsif (name=="dots")
return process_bar.bar("solid_circle","hollow_circle","curve",length);
- elsif(name=="ticks")
+ elsif (name=="ticks")
return process_bar.bar("tick","space","line",length);
- elsif(name=="deep_shadow")
+ elsif (name=="deep_shadow")
return process_bar.bar("deep_shadow","light_shadow","line",length);
- elsif(name=="block")
+ elsif (name=="block")
return process_bar.bar("block","light_shadow","line",length);
- elsif(name=="oneline")
+ elsif (name=="oneline")
return process_bar.bar("line","space","space",length);
else
return process_bar.bar("sharp","point","bracket",length);
}
-var default_spinner=func(name="classic",repeat=1){
- if(typeof(name)!="str")
+var default_spinner = func(name = "classic", repeat = 1) {
+ if (typeof(name)!="str")
name="classic";
- if(name=="rise")
+ if (name=="rise")
return process_bar.spinner("rise",repeat);
- elsif(name=="vertical")
+ elsif (name=="vertical")
return process_bar.spinner("vertical",repeat);
- elsif(name=="dot")
+ elsif (name=="dot")
return process_bar.spinner("dot",repeat);
- elsif(name=="dots")
+ elsif (name=="dots")
return process_bar.spinner("dots",repeat);
- elsif(name=="arrow")
+ elsif (name=="arrow")
return process_bar.spinner("arrow",repeat);
- elsif(name=="classic")
+ elsif (name=="classic")
return process_bar.spinner("classic",repeat);
- elsif(name=="balls")
+ elsif (name=="balls")
return process_bar.spinner("balls",repeat);
- elsif(name=="dots_wave")
+ elsif (name=="dots_wave")
return process_bar.spinner("dots_wave",repeat);
- elsif(name=="pulse")
+ elsif (name=="pulse")
return process_bar.spinner("pulse",repeat);
- elsif(name=="wave")
+ elsif (name=="wave")
return process_bar.spinner("wave",repeat);
- elsif(name=="short_wave")
+ elsif (name=="short_wave")
return process_bar.spinner("short_wave",repeat);
- elsif(name=="fish")
+ elsif (name=="fish")
return process_bar.spinner("fish",repeat);
- elsif(name=="happy")
+ elsif (name=="happy")
return process_bar.spinner("happy",repeat);
- elsif(name=="wait")
+ elsif (name=="wait")
return process_bar.spinner("wait",repeat);
- elsif(name=="stars")
+ elsif (name=="stars")
return process_bar.spinner("stars",repeat);
else
return process_bar.spinner("classic",repeat);
}
-var show=func(){
+var show = func() {
print("\ec");
var bars={
"classic ":process_bar.default_bar("classic",40),
@@ -333,12 +333,12 @@ var show=func(){
};
var bar_key=keys(bars);
var spin_key=keys(spinners);
- for(var i=0;i<40;i+=1){
- forindex(var j;bar_key){
+ for(var i=0; i<40; i+=1) {
+ forindex(var j; bar_key) {
var k=bar_key[j];
print("\e["~(j+1)~";1H["~k~"] "~bars[k].bar((i+1)/40));
}
- forindex(var j;spin_key){
+ forindex(var j; spin_key) {
var k=spin_key[j];
print("\e["~(j+1+size(bars))~";1H["~k~"] |"~spinners[k].next()~"|");
}
diff --git a/std/props.nas b/std/props.nas
index 5719e37..ffb693f 100644
--- a/std/props.nas
+++ b/std/props.nas
@@ -195,15 +195,15 @@ var Node = {
getPath : func {
var (name, index, parent) = (me.getName(), me.getIndex(), me.getParent());
- if(index != 0) { name ~= "[" ~ index ~ "]"; }
- if(parent != nil) { name = parent.getPath() ~ "/" ~ name; }
+ if (index != 0) { name ~= "[" ~ index ~ "]"; }
+ if (parent != nil) { name = parent.getPath() ~ "/" ~ name; }
return name;
},
getBoolValue : func {
var val = me.getValue();
var mytype = me.getType();
- if((mytype == "STRING" or mytype == "UNSPECIFIED") and val == "false") return 0;
+ if ((mytype == "STRING" or mytype == "UNSPECIFIED") and val == "false") return 0;
return !!val;
},
@@ -216,7 +216,7 @@ var Node = {
},
remove : func {
- if((var p = me.getParent()) == nil) return nil;
+ if ((var p = me.getParent()) == nil) return nil;
p.removeChild(me.getName(), me.getIndex());
},
@@ -300,7 +300,7 @@ var Node = {
#
Node.new = func(values = nil) {
var result = wrapNode(_new());
- if(ishash(values)) {
+ if (ishash(values)) {
result.setValues(values);
}
return result;
@@ -316,18 +316,18 @@ Node.new = func(values = nil) {
#
Node.getValues = func {
var children = me.getChildren();
- if(!size(children)) return me.getValue();
+ if (!size(children)) return me.getValue();
var val = {};
var numchld = {};
foreach(var c; children) {
var name = c.getName();
- if(contains(numchld, name)) { var nc = numchld[name]; }
+ if (contains(numchld, name)) { var nc = numchld[name]; }
else {
var nc = size(me.getChildren(name));
numchld[name] = nc;
- if(nc > 1 and !contains(val, name)) val[name] = [];
+ if (nc > 1 and !contains(val, name)) val[name] = [];
}
- if(nc > 1) append(val[name], c.getValues());
+ if (nc > 1) append(val[name], c.getValues());
else val[name] = c.getValues();
}
return val;
@@ -346,13 +346,13 @@ Node.getValues = func {
#
Node.initNode = func(path = nil, value = 0, type = nil, force = 0) {
var prop = me.getNode(path or "", 1);
- if(prop.getType() != "NONE") value = prop.getValue();
- if(force) prop.clearValue();
- if(type == nil) prop.setValue(value);
- elsif(type == "DOUBLE") prop.setDoubleValue(value);
- elsif(type == "INT") prop.setIntValue(value);
- elsif(type == "BOOL") prop.setBoolValue(value);
- elsif(type == "STRING") prop.setValue("" ~ value);
+ if (prop.getType() != "NONE") value = prop.getValue();
+ if (force) prop.clearValue();
+ if (type == nil) prop.setValue(value);
+ elsif (type == "DOUBLE") prop.setDoubleValue(value);
+ elsif (type == "INT") prop.setIntValue(value);
+ elsif (type == "BOOL") prop.setBoolValue(value);
+ elsif (type == "STRING") prop.setValue("" ~ value);
else die("initNode(): unsupported type '" ~ type ~ "'");
return prop;
}
@@ -363,7 +363,7 @@ Node.initNode = func(path = nil, value = 0, type = nil, force = 0) {
# to a key for a fun hack.
#
var dump = func {
- if(size(arg) == 1) { var prefix = ""; var node = arg[0]; }
+ if (size(arg) == 1) { var prefix = ""; var node = arg[0]; }
else { var prefix = arg[0]; var node = arg[1]; }
var index = node.getIndex();
@@ -371,13 +371,13 @@ var dump = func {
var name = node.getName();
var val = node.getValue();
- if(val == nil) { val = "nil"; }
+ if (val == nil) { val = "nil"; }
name = prefix ~ name;
- if(index > 0) { name = name ~ "[" ~ index ~ "]"; }
+ if (index > 0) { name = name ~ "[" ~ index ~ "]"; }
print(name, " {", type, "} = ", val);
# Don't recurse into aliases, lest we get stuck in a loop
- if(type != "ALIAS") {
+ if (type != "ALIAS") {
var children = node.getChildren();
foreach(var c; children) { dump(name ~ "/", c); }
}
@@ -413,12 +413,12 @@ var copy = func(src, dest, attr = 0) {
}
var type = src.getType();
var val = src.getValue();
- if(type == "ALIAS" or type == "NONE") return;
- elsif(type == "BOOL") dest.setBoolValue(val);
- elsif(type == "INT" or type == "LONG") dest.setIntValue(val);
- elsif(type == "FLOAT" or type == "DOUBLE") dest.setDoubleValue(val);
+ if (type == "ALIAS" or type == "NONE") return;
+ elsif (type == "BOOL") dest.setBoolValue(val);
+ elsif (type == "INT" or type == "LONG") dest.setIntValue(val);
+ elsif (type == "FLOAT" or type == "DOUBLE") dest.setDoubleValue(val);
else dest.setValue(val);
- if(attr) dest.setAttribute(src.getAttribute());
+ if (attr) dest.setAttribute(src.getAttribute());
}
##
@@ -426,9 +426,9 @@ var copy = func(src, dest, attr = 0) {
# array) into Node objects.
#
var wrap = func(node) {
- if(isghost(node)) {
+ if (isghost(node)) {
return wrapNode(node);
- } elsif(isvec(node)) {
+ } elsif (isvec(node)) {
var v = node;
var n = size(v);
for(var i=0; i 0) return left > right;
+ if (op < 0) return left < right;
+ if (op > 0) return left > right;
return left == right;
}
@@ -622,7 +622,7 @@ var _cond_cmp = func(p, op) {
# in the binding.
#
var runBinding = func(node, module = nil) {
- if(module != nil and node.getNode("module") == nil)
+ if (module != nil and node.getNode("module") == nil)
node.getNode("module", 1).setValue(module);
var cmd = node.getNode("command", 1).getValue() or "null";
condition(node.getNode("condition")) ? fgcommand(cmd, node) : 0;
@@ -702,13 +702,13 @@ var UpdateManager =
me.localType = me.property.getType();
if (me.localType == "INT" or me.localType == "LONG" or me.localType == "FLOAT" or me.localType == "DOUBLE")
{
- if(me.lastval == nil or math.abs(me.lastval - me.curval) >= me.delta)
+ if (me.lastval == nil or math.abs(me.lastval - me.curval) >= me.delta)
{
me.lastval = me.curval;
me.changed(me.curval);
}
}
- else if(me.lastval == nil or me.lastval != me.curval)
+ else if (me.lastval == nil or me.lastval != me.curval)
{
me.lastval = me.curval;
me.changed(me.curval);
diff --git a/std/queue.nas b/std/queue.nas
index 1c98f84..d662e77 100644
--- a/std/queue.nas
+++ b/std/queue.nas
@@ -1,34 +1,34 @@
# queue.nas
# valkmjolnir 2021/3/31
-var new=func(){
- var (begin,end)=(nil,nil);
+var new = func() {
+ var (begin, end) = (nil, nil);
return{
- push:func(elem){
+ push: func(elem) {
var new_node={
elem:elem,
next:nil
};
- if(begin==nil)
+ if (begin==nil)
begin=end=new_node;
- else{
+ else {
end.next=new_node;
end=new_node;
}
},
- pop:func(){
- if(begin!=nil)
+ pop: func() {
+ if (begin!=nil)
begin=begin.next;
- if(begin==nil)
+ if (begin==nil)
end=nil;
},
- front:func(){
- if(begin!=nil)
+ front: func() {
+ if (begin!=nil)
return begin.elem;
},
- clear:func(){
+ clear: func() {
begin=end=nil;
},
- empty:func(){
+ empty: func() {
return begin==nil;
}
};
diff --git a/std/string.nas b/std/string.nas
index 81da2fa..bed819f 100644
--- a/std/string.nas
+++ b/std/string.nas
@@ -1,7 +1,7 @@
# string.nas
# ValKmjolnir 2022/10/5
-var join = func(sep, vec){
+var join = func(sep, vec) {
var len = size(vec);
var res = "";
for(var i = 0; i 0 and size(hostname) != 0) {
- while(socket.bind(client, hostname, port)<0){
+ while(socket.bind(client, hostname, port)<0) {
println("[",os.time(),"] failed to bind socket "~client~" at ", hostname, ":", port, ".");
unix.sleep(retry_delay);
println("[",os.time(),"] retrying...");
diff --git a/std/unix.nas b/std/unix.nas
index 9639400..88f0282 100644
--- a/std/unix.nas
+++ b/std/unix.nas
@@ -1,5 +1,6 @@
# unix.nas
# 2023 by ValKmjolnir
+use std.bits;
var _S_IFDIR = 0x4000;
var _S_IFREG = 0x8000;
diff --git a/test/ascii-art.nas b/test/ascii-art.nas
index 2f04b89..95c53ea 100644
--- a/test/ascii-art.nas
+++ b/test/ascii-art.nas
@@ -31,14 +31,14 @@ var char_ttf=[
["███████╗","╚══███╔╝"," ███╔╝ "," ███╔╝ ","███████╗","╚══════╝"],
];
-var trans_ttf=func(string){
+var trans_ttf = func(string) {
var str=["","","","","",""];
- for(var i=0;i=0;i-=1){
+ for(var loop=0;loop=0;i-=1) {
var rand_index=int(i*rand());
(arr[i],arr[rand_index])=(arr[rand_index],arr[i]);
}
@@ -102,7 +102,7 @@ var curve3=func(line=2){
return;
}
-var curve4=func(line=4){
+var curve4 = func(line=4) {
var shadow=["m░\e[0m","m▒\e[0m","m▓\e[0m","m█\e[0m","m▀\e[0m","m▄\e[0m","m▐\e[0m","m▌\e[0m"];
var front=[
"30","31","32","33","34","35","36","37",
@@ -113,16 +113,16 @@ var curve4=func(line=4){
"100","101","102","103","104","105","106","107"
];
rand(time(0));
- for(var i=0;i180)
+var position_change = func(position_val,value) {
+ if (position_val+value>180)
position_val += value-360;
- else if(position_val+value<-180)
+ else if (position_val+value<-180)
position_val += value+360;
else
position_val += value;
return position_val;
}
-var road_check_func = func(){
+var road_check_func = func() {
var lat = props.getNode("/position/latitude-deg",1).getValue();
var lon = props.getNode("/position/longitude-deg",1).getValue();
var position_info = geodinfo(lat,lon);
var position_names = position_info[1].names;
- if((position_names[0]=="Freeway") or (position_names[0]=="Road")){
+ if ((position_names[0]=="Freeway") or (position_names[0]=="Road")) {
var car_heading = 0;
var lat_change = 0;
var lon_change = 0;
var left_range = 0;
var right_range = 0;
- for(var i=0;i>-0.00005;i-=0.000001){
+ for(var i=0;i>-0.00005;i-=0.000001) {
car_heading = props.getNode("/orientation/heading-deg",1).getValue();
lat_change = math.sin(D2R*car_heading);
lon_change = -math.cos(D2R*car_heading);
@@ -41,12 +41,12 @@ var road_check_func = func(){
lon = props.getNode("/position/longitude-deg",1).getValue()+0.0001*math.sin(D2R*car_heading);
var other_position_info = geodinfo(position_change(lat,i*lat_change),position_change(lon,i*lon_change));
var other_names = other_position_info[1].names;
- if((other_names[0]=="Freeway") or (other_names[0]=="Road"))
+ if ((other_names[0]=="Freeway") or (other_names[0]=="Road"))
right_range += 1;
else
break;
}
- for(var i=0;i<0.00005;i+=0.000001){
+ for(var i=0;i<0.00005;i+=0.000001) {
car_heading = props.getNode("/orientation/heading-deg",1).getValue();
lat_change = math.sin(D2R*car_heading);
lon_change = -math.cos(D2R*car_heading);
@@ -54,7 +54,7 @@ var road_check_func = func(){
lon = props.getNode("/position/longitude-deg",1).getValue()+0.0001*math.sin(D2R*car_heading);
var other_position_info = geodinfo(position_change(lat,i*lat_change),position_change(lon,i*lon_change));
var other_names = other_position_info[1].names;
- if((other_names[0]=="Freeway") or (other_names[0]=="Road"))
+ if ((other_names[0]=="Freeway") or (other_names[0]=="Road"))
left_range+=1;
else
break;
@@ -64,9 +64,9 @@ var road_check_func = func(){
derivative=(error-previous_error)/dt;
var (Kp,Ki,Kd)=(1/900,0.05,0.005);
# print("change p ",Kp*error*error,' i ',Ki*intergral,' d ',Kd*derivative);
- if(error<0)
+ if (error<0)
props.getNode("/", 1).setValue("/controls/flight/rudder",-Kp*error*error+Ki*intergral+Kd*derivative);
- else if(error>0)
+ else if (error>0)
props.getNode("/", 1).setValue("/controls/flight/rudder",Kp*error*error+Ki*intergral+Kd*derivative);
else
props.getNode("/", 1).setValue("/controls/flight/rudder",0);
@@ -81,12 +81,12 @@ var road_check_func = func(){
};
var road_check_timer = maketimer(0.01,road_check_func);
-var toggle_auto_pilot = func(){
- if(!road_check_timer.isRunning){
+var toggle_auto_pilot = func() {
+ if (!road_check_timer.isRunning) {
intergral=0;
road_check_timer.start();
props.getNode("/sim/messages/copilot",1).setValue('/',"ze dong sheng teaan see tong yee tse yung. Auto Sheng Teaan System Activated!");
- }else{
+ } else {
road_check_timer.stop();
props.getNode("/sim/messages/copilot",1).setValue('/',"ze dong sheng teaan see tong yee guan bee. Auto Sheng Teaan System is off.");
}
diff --git a/test/bf.nas b/test/bf.nas
index 1afe0b8..546446c 100644
--- a/test/bf.nas
+++ b/test/bf.nas
@@ -147,7 +147,7 @@ var mandelbrot=
var (ptr,pc,paper,inum)=(0,0,[],[]);
-var character=func() {
+var character = func() {
var res=[];
setsize(res,256);
forindex(var i;res) {
@@ -159,55 +159,55 @@ var character=func() {
var (add,mov,jt,jf,in,out)=(
func {paper[ptr]+=inum[pc];},
func {ptr+=inum[pc];},
- func {if(paper[ptr])pc=inum[pc];},
- func {if(!paper[ptr])pc=inum[pc];},
+ func {if (paper[ptr])pc=inum[pc];},
+ func {if (!paper[ptr])pc=inum[pc];},
func {paper[ptr]=input()[0];},
func {print(character[paper[ptr]]);}
);
-var codegen=func(program) {
+var codegen = func(program) {
var (code,stack)=([],[]);
var len=size(program);
for(var i=0;i') {
+ } elsif (c=='<' or c=='>') {
append(code,mov);
append(inum,0);
- for(;i') {
+ for(;i') {
inum[-1]+=1;
- } elsif(chr(program[i])=='<') {
+ } elsif (chr(program[i])=='<') {
inum[-1]-=1;
- } elsif(chr(program[i])!='\n') {
+ } elsif (chr(program[i])!='\n') {
i-=1;
break;
}
}
- } elsif(c==',') {
+ } elsif (c==',') {
append(code,in);
append(inum,0);
- } elsif(c=='.') {
+ } elsif (c=='.') {
append(code,out);
append(inum,0);
- } elsif(c=='[') {
+ } elsif (c=='[') {
append(code,jf);
append(inum,0);
append(stack,size(code)-1);
- } elsif(c==']') {
- if(!size(stack)) {
+ } elsif (c==']') {
+ if (!size(stack)) {
die("lack [");
}
var label=pop(stack);
@@ -217,7 +217,7 @@ var codegen=func(program) {
}
}
- if(size(stack)) {
+ if (size(stack)) {
die("lack "~size(stack)~" \"]\"");
return;
}
@@ -225,9 +225,9 @@ var codegen=func(program) {
return code;
}
-var bf=func(program) {
+var bf = func(program) {
# enable ANSI escape sequence
- if(os.platform()=="windows") {
+ if (os.platform()=="windows") {
system("color");
}
diff --git a/test/bfconvertor.nas b/test/bfconvertor.nas
index 55907c9..074c844 100644
--- a/test/bfconvertor.nas
+++ b/test/bfconvertor.nas
@@ -145,7 +145,7 @@ var mandelbrot=
+[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<<
<<<<<]]>>>]";
-var padding=func(len) {
+var padding = func(len) {
var res="";
for(var i=0;i0) {
+ if (cnt>0) {
f~="paper[ptr]+="~cnt~";\n";
- } elsif(cnt<0) {
+ } elsif (cnt<0) {
f~="paper[ptr]-="~(-cnt)~";\n";
}
- } elsif(c=='<' or c=='>') {
+ } elsif (c=='<' or c=='>') {
var cnt=0;
for(;i') {
+ if (chr(program[i])=='>') {
cnt+=1;
- } elsif(chr(program[i])=='<') {
+ } elsif (chr(program[i])=='<') {
cnt-=1;
- } elsif(chr(program[i])!='\n') {
+ } elsif (chr(program[i])!='\n') {
i-=1;
break;
}
}
- if(cnt!=0) {
+ if (cnt!=0) {
f~=padding(size(stack));
}
- if(cnt>0) {
+ if (cnt>0) {
f~="ptr+="~cnt~";\n";
- } elsif(cnt<0) {
+ } elsif (cnt<0) {
f~="ptr-="~(-cnt)~";\n";
}
- } elsif(c==',') {
+ } elsif (c==',') {
f~=padding(size(stack));
f~="paper[ptr]=input()[0];\n";
- } elsif(c=='.') {
+ } elsif (c=='.') {
f~=padding(size(stack));
f~="print(chr(paper[ptr]));\n";
- } elsif(c=='[') {
+ } elsif (c=='[') {
f~=padding(size(stack));
f~="while(paper[ptr]) {\n";
append(stack,0);
- } elsif(c==']') {
- if(!size(stack)) {
+ } elsif (c==']') {
+ if (!size(stack)) {
println("lack [");
return;
}
@@ -219,7 +219,7 @@ var bf=func(program) {
f~="}\n";
}
}
- if(size(stack)) {
+ if (size(stack)) {
println("lack ]");
return;
}
diff --git a/test/bfs.nas b/test/bfs.nas
index 1520e7a..3775981 100644
--- a/test/bfs.nas
+++ b/test/bfs.nas
@@ -3,15 +3,15 @@ use std.queue;
rand(time(0));
var pixel=[' ','#','.','*'];
var map=[];
-for(var i=0;i<10;i+=1){
+for(var i=0;i<10;i+=1) {
append(map,[]);
for(var j=0;j<20;j+=1)
append(map[i],(rand()>0.7));
}
-var prt=func(){
+var prt = func() {
var s="\e[0;0H+--------------------+\n";
- for(var i=0;i<10;i+=1){
+ for(var i=0;i<10;i+=1) {
s~="|";
for(var j=0;j<20;j+=1)
s~=pixel[map[i][j]];
@@ -22,27 +22,27 @@ var prt=func(){
unix.sleep(1/800);
}
-var bfs=func(begin,end){
+var bfs = func(begin,end) {
var move=[[1,0],[0,1],[-1,0],[0,-1]];
var que=queue.new();
que.push(begin);
map[begin[0]][begin[1]]=2;
map[end[0]][end[1]]=0;
- if(map[1][0]==1 and map[0][1]==1)
+ if (map[1][0]==1 and map[0][1]==1)
map[1][0]=0;
- while(!que.empty()){
+ while(!que.empty()) {
var vertex=que.front();
que.pop();
- foreach(var i;move){
+ foreach(var i;move) {
var x=vertex[0]+i[0];
var y=vertex[1]+i[1];
- if(x==end[0] and y==end[1]){
+ if (x==end[0] and y==end[1]) {
map[x][y]=3;
prt();
print("reached.\n");
return;
}
- if(0<=x and x<10 and 0<=y and y<20 and map[x][y]==0){
+ if (0<=x and x<10 and 0<=y and y<20 and map[x][y]==0) {
que.push([x,y]);
map[x][y]=2;
}
@@ -54,7 +54,7 @@ var bfs=func(begin,end){
}
# enable ANSI escape sequence
-if(os.platform()=="windows")
+if (os.platform()=="windows")
system("color");
print("\ec");
bfs([0,0],[9,19]);
\ No newline at end of file
diff --git a/test/bp.nas b/test/bp.nas
index 88dadf9..198ac38 100644
--- a/test/bp.nas
+++ b/test/bp.nas
@@ -2,7 +2,7 @@ use std.mat;
rand(time(0));
-var new_neuron=func(){
+var new_neuron = func() {
return {
in:0,
out:0,
@@ -12,18 +12,18 @@ var new_neuron=func(){
};
}
-var tanh=func(x){
+var tanh = func(x) {
var (a,b)=(math.exp(x),math.exp(-x));
return (a-b)/(a+b);
}
-var difftanh=func(x){
+var difftanh = func(x) {
x=tanh(x);
return 1-x*x;
}
-var sigmoid=func(x){
+var sigmoid = func(x) {
return 1/(1+math.exp(-x));
}
-var diffsigmoid=func(x){
+var diffsigmoid = func(x) {
x=sigmoid(x);
return x*(1-x);
}
@@ -33,7 +33,7 @@ var training_set=[[0,0],[0,1],[1,0],[1,1]];
var expect=[0,1,1,0];
var hidden=[];
-for(var i=0;i0.5?-2*rand():2*rand());
@@ -41,22 +41,22 @@ for(var i=0;i0.5?-2*rand():2*rand());
output[i].bia=rand()>0.5?-5*rand():5*rand();
}
-var forward=func(x){
+var forward = func(x) {
var input=training_set[x];
- for(var i=0;i0.0005){
+while(error>0.0005) {
error=0;
- for(var i=0;i<4;i+=1){
+ for(var i=0;i<4;i+=1) {
forward(i);
error+=get_error(i);
backward(i);
}
cnt+=1;
- if(cnt>=1e4)
+ if (cnt>=1e4)
break;
}
-if(cnt>=3e5){
+if (cnt>=3e5) {
print("failed to train, ",cnt," epoch.\n");
-}else{
+} else {
print('finished after ',cnt,' epoch.\n');
}
-foreach(var v;training_set){
+foreach(var v;training_set) {
run(v);
print(v,': ',output[0].out,'\n');
}
diff --git a/test/calc.nas b/test/calc.nas
index 516a2db..98a3d41 100644
--- a/test/calc.nas
+++ b/test/calc.nas
@@ -2,18 +2,18 @@ use std.padding;
use std.file;
var source=file.find_all_files_with_extension("./src","cpp","h");
-sort(source,func(a,b){return cmp(a,b)<0});
+sort(source,func(a,b) {return cmp(a,b)<0});
var lib=file.find_all_files_with_extension("./std","nas");
-sort(lib,func(a,b){return cmp(a,b)<0});
+sort(lib,func(a,b) {return cmp(a,b)<0});
var testfile=file.find_all_files_with_extension("./test","nas");
-sort(testfile,func(a,b){return cmp(a,b)<0});
+sort(testfile,func(a,b) {return cmp(a,b)<0});
var module=file.find_all_files_with_extension("./module","cpp","nas");
-sort(module,func(a,b){return cmp(a,b)<0});
+sort(module,func(a,b) {return cmp(a,b)<0});
-var longest=func(vec...){
+var longest = func(vec...) {
var len=0;
foreach(var v;vec)
foreach(var f;v)
@@ -22,41 +22,41 @@ var longest=func(vec...){
}
var padding_length=longest(source,lib,testfile,module);
-var blank=func(s){
- if(!size(s)){
+var blank = func(s) {
+ if (!size(s)) {
return 1;
}
var space=[" "[0],"\n"[0],"\t"[0],"\r"[0]];
- for(var i=0;i=1000?substr(str(number/1000),0,4)~'k':str(number);
return padding.leftpad(number,6);
}
-var calc=func(codetype,files,path=""){
+var calc = func(codetype,files,path="") {
println(codetype);
var (bytes,ctx,line,semi,line_cnt,semi_cnt)=(0,"",0,0,0,0);
- forindex(var i;files){
+ forindex(var i;files) {
var s=io.exists(path~files[i])?io.readfile(path~files[i]):"";
(line_cnt,semi_cnt)=(count(s,'\n'),count(s,';'));
println(padding.rightpad(files[i],padding_length),'|',
diff --git a/test/choice.nas b/test/choice.nas
index 6b04247..c2e9699 100644
--- a/test/choice.nas
+++ b/test/choice.nas
@@ -1,21 +1,21 @@
var condition_true=1;
var condition_false=0;
-if(condition_true) {
+if (condition_true) {
var a=1;
-} else if(!condition_false) {
+} else if (!condition_false) {
var b=1;
-} elsif(!condition_true and condition_false) {
+} elsif (!condition_true and condition_false) {
print("impossible");
} else {
var c=1;
var d=1;
}
-if(condition_true)
+if (condition_true)
var a=1;
-else if(!condition_false)
+else if (!condition_false)
var b=1;
-elsif(!condition_true and condition_false)
+elsif (!condition_true and condition_false)
print("impossible");
else
var c=1;
\ No newline at end of file
diff --git a/test/class.nas b/test/class.nas
index c326a05..a28cadc 100644
--- a/test/class.nas
+++ b/test/class.nas
@@ -1,4 +1,4 @@
-var student=func(n,a){
+var student = func(n,a) {
return {
print_info:func println(n,' ',a),
set_age: func(age) a=age,
@@ -19,31 +19,31 @@ s.set_name('Sidi Liang');
s.print_info();
println(s.get_age(),' ',s.get_name());
# flightgear nasal-console cannot use this kind of object initializing
-var m=func(){
+var m = func() {
var (_1,_2)=(0,1);
return {
- a:func(){
+ a:func() {
print(_1,' ',_2,'\n');
},
- b:func(x){
+ b:func(x) {
_1=x;
},
- c:func(x){
+ c:func(x) {
_2=x;
},
- d:func(x){
- return func{
+ d:func(x) {
+ return func {
print(_1,' ',_2,' ',x,'\n');
};
},
- g:func(x){
+ g:func(x) {
var y=x;
- return func{
+ return func {
print(_1,' ',_2,' ',x,' ',y,'\n');
}
},
- h:func(){
- return func(x){
+ h:func() {
+ return func(x) {
_1=x;
}
}
diff --git a/test/console3D.nas b/test/console3D.nas
index 9226d68..0703a46 100644
--- a/test/console3D.nas
+++ b/test/console3D.nas
@@ -24,7 +24,7 @@
use module.libmat;
use std.runtime;
-func(){
+func() {
# allocate more spaces
for(var i = 0; i<10; i+=1) {
runtime.gc.extend("str");
@@ -71,61 +71,61 @@ var (rotateX,rotateY,rotateZ)=(
libmat.vec3.rz,
);
-var use_raw=func(){
- vec2=func(x,y){return [x,y];}
- vec2add=func(v1,v2){return [v1[0]+v2[0],v1[1]+v2[1]];}
- vec2sub=func(v1,v2){return [v1[0]-v2[0],v1[1]-v2[1]];}
- vec2mul=func(v1,v2){return [v1[0]*v2[0],v1[1]*v2[1]];}
- vec2div=func(v1,v2){return [v1[0]/v2[0],v1[1]/v2[1]];}
- vec3=func(x,y,z){return [x,y,z];}
- vec3add=func(v1,v2){return [v1[0]+v2[0],v1[1]+v2[1],v1[2]+v2[2]];}
- vec3sub=func(v1,v2){return [v1[0]-v2[0],v1[1]-v2[1],v1[2]-v2[2]];}
- vec3mul=func(v1,v2){return [v1[0]*v2[0],v1[1]*v2[1],v1[2]*v2[2]];}
- vec3div=func(v1,v2){return [v1[0]/v2[0],v1[1]/v2[1],v1[2]/v2[2]];}
- vec3neg=func(v){return [-v[0],-v[1],-v[2]];}
- vec2len=func(v){var (x,y)=(v[0],v[1]); return sqrt(x*x+y*y);}
- vec3len=func(v){var (x,y,z)=(v[0],v[1],v[2]); return sqrt(x*x+y*y+z*z);}
- vec3norm=func(v){var t=vec3len(v); return vec3div(v,[t,t,t]);}
- vec3dot=func(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];}
- rotateX=func(a,angle){return [a[0],a[2]*sin(angle)+a[1]*cos(angle),a[2]*cos(angle)-a[1]*sin(angle)];}
- rotateY=func(a,angle){return [a[0]*cos(angle)-a[2]*sin(angle),a[1],a[0]*sin(angle)+a[2]*cos(angle)];}
- rotateZ=func(a,angle){return [a[0]*cos(angle)-a[1]*sin(angle),a[0]*sin(angle)+a[1]*cos(angle),a[2]];}
+var use_raw = func() {
+ vec2 = func(x,y) {return [x,y];}
+ vec2add = func(v1,v2) {return [v1[0]+v2[0],v1[1]+v2[1]];}
+ vec2sub = func(v1,v2) {return [v1[0]-v2[0],v1[1]-v2[1]];}
+ vec2mul = func(v1,v2) {return [v1[0]*v2[0],v1[1]*v2[1]];}
+ vec2div = func(v1,v2) {return [v1[0]/v2[0],v1[1]/v2[1]];}
+ vec3 = func(x,y,z) {return [x,y,z];}
+ vec3add = func(v1,v2) {return [v1[0]+v2[0],v1[1]+v2[1],v1[2]+v2[2]];}
+ vec3sub = func(v1,v2) {return [v1[0]-v2[0],v1[1]-v2[1],v1[2]-v2[2]];}
+ vec3mul = func(v1,v2) {return [v1[0]*v2[0],v1[1]*v2[1],v1[2]*v2[2]];}
+ vec3div = func(v1,v2) {return [v1[0]/v2[0],v1[1]/v2[1],v1[2]/v2[2]];}
+ vec3neg = func(v) {return [-v[0],-v[1],-v[2]];}
+ vec2len = func(v) {var (x,y)=(v[0],v[1]); return sqrt(x*x+y*y);}
+ vec3len = func(v) {var (x,y,z)=(v[0],v[1],v[2]); return sqrt(x*x+y*y+z*z);}
+ vec3norm = func(v) {var t=vec3len(v); return vec3div(v,[t,t,t]);}
+ vec3dot = func(a,b) {return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];}
+ rotateX = func(a,angle) {return [a[0],a[2]*sin(angle)+a[1]*cos(angle),a[2]*cos(angle)-a[1]*sin(angle)];}
+ rotateY = func(a,angle) {return [a[0]*cos(angle)-a[2]*sin(angle),a[1],a[0]*sin(angle)+a[2]*cos(angle)];}
+ rotateZ = func(a,angle) {return [a[0]*cos(angle)-a[1]*sin(angle),a[0]*sin(angle)+a[1]*cos(angle),a[2]];}
}
-var clamp=func(value,_min,_max){
+var clamp = func(value,_min,_max) {
return max(min(value,_max),_min);
}
-var sign=func(a){
+var sign = func(a) {
return (0edge;
}
-var vec3abs=func(v){
+var vec3abs = func(v) {
return [abs(v[0]),abs(v[1]),abs(v[2])];
}
-var vec3sign=func(v){
+var vec3sign = func(v) {
return [sign(v[0]),sign(v[1]),sign(v[2])];
}
-var vec3step=func(edge,v){
+var vec3step = func(edge,v) {
return [step(edge[0],v[0]),step(edge[1],v[1]),step(edge[2],v[2])];
}
-var vec3reflect=func(rd,n){
+var vec3reflect = func(rd,n) {
var d=vec3dot(n,rd);
return vec3sub(rd,vec3mul(n,vec3mul([2,2,2],[d,d,d])));
}
-var sphere=func(ro,rd,r) {
+var sphere = func(ro,rd,r) {
var b=vec3dot(ro,rd);
var c=vec3dot(ro,ro)-r*r;
var h=b*b-c;
- if(h<0.0) return [-1.0,-1.0];
+ if (h<0.0) return [-1.0,-1.0];
h=sqrt(h);
return [-b-h,-b+h];
}
-var box=func(ro,rd,boxSize,outNormal) {
+var box = func(ro,rd,boxSize,outNormal) {
var m=vec3div([1.0,1.0,1.0],rd);
var n=vec3mul(m,ro);
var k=vec3mul(vec3abs(m),boxSize);
@@ -143,11 +143,11 @@ var box=func(ro,rd,boxSize,outNormal) {
return [tN, tF];
}
-var plane=func(ro,rd,p,w) {
+var plane = func(ro,rd,p,w) {
return -(vec3dot(ro,p)+w)/vec3dot(rd,p);
}
-var main=func(frame) {
+var main = func(frame) {
var height=15*2;
var width=int(height*1/0.618)*2;
@@ -171,10 +171,10 @@ var main=func(frame) {
print("\e[2J");
var stamp=maketimestamp();
- for(var t=0;t0){
+ if (intersection[0]>0) {
var itPoint=vec3add(vec3sub(ro,spherePos),vec3mul(rd,[intersection[0],intersection[0],intersection[0]]));
minIt=intersection[0];
n=vec3norm(itPoint);
}
var boxN=[0,0,0];
intersection=box(ro,rd,vec3_111,boxN);
- if(intersection[0]>0 and intersection[0]0 and intersection[0]0 and intersection[0]0 and intersection[0]=0;i-=1) {
@@ -10,7 +10,7 @@ var mess=func(vec) {
}
}
-var project=func(n) {
+var project = func(n) {
# get(s) :- color(_, s, _).
var ts=maketimestamp();
@@ -24,7 +24,7 @@ var project=func(n) {
for(var i=0;i1/500) {
+ if ((i-last_step)/n>1/500) {
last_step=i;
print(" ",bar.bar((i+1)/n)," ",
padding.leftpad(str(int((i+1)/n*100)),3),"% | \r");
@@ -45,7 +45,7 @@ var project=func(n) {
println(padding.rightpad(str(cnt),7)," in ",ts.elapsedMSec()/1000," s");
}
-var select=func(n) {
+var select = func(n) {
# get(s) :- color(_, _, x), message(x, s).
var ts=maketimestamp();
@@ -62,7 +62,7 @@ var select=func(n) {
color[i]=[i,"color "~i,i+n*10];
message[i]=[i+n*10,"message "~i];
# generate process bar, every 0.2%
- if((i-last_step)/n>1/500) {
+ if ((i-last_step)/n>1/500) {
last_step=i;
print(" ",bar.bar((i+1)/n)," ",
padding.leftpad(str(int((i+1)/n*100)),3),"% | \r");
@@ -75,8 +75,8 @@ var select=func(n) {
mess(message);
ts.stamp();
- sort(color,func(a,b){return a[2]res) {
+ } else if (data>res) {
left=mid+1;
} else {
right=mid-1;
@@ -100,7 +100,7 @@ var select=func(n) {
println(padding.rightpad(str(cnt),7)," in ",ts.elapsedMSec()/1000," s");
}
-var cartesian=func(n) {
+var cartesian = func(n) {
# get(x, y, z, a, b) :- color(x, y, z), message(a, b).
var ts=maketimestamp();
@@ -117,7 +117,7 @@ var cartesian=func(n) {
color[i]=[i,"color "~i,i+n*10];
message[i]=[i+n*10,"message "~i];
# generate process bar, every 0.2%
- if((i-last_step)/n>1/500) {
+ if ((i-last_step)/n>1/500) {
last_step=i;
print(" ",bar.bar((i+1)/n)," ",
padding.leftpad(str(int((i+1)/n*100)),3),"% | \r");
diff --git a/test/diff.nas b/test/diff.nas
index 02ad2cc..9a7a492 100644
--- a/test/diff.nas
+++ b/test/diff.nas
@@ -1,4 +1,4 @@
-var myers=func(src,dst,show_table=0){
+var myers = func(src,dst,show_table=0) {
(src,dst)=(split("\n",src),split("\n",dst));
append(src,"");
append(dst,"");
@@ -6,12 +6,12 @@ var myers=func(src,dst,show_table=0){
var mat=[];
setsize(mat,dst_len*src_len);
- forindex(var i;mat){
+ forindex(var i;mat) {
mat[i]=0;
}
var visited=[];
setsize(visited,dst_len*src_len);
- forindex(var i;visited){
+ forindex(var i;visited) {
visited[i]=0;
}
@@ -19,15 +19,15 @@ var myers=func(src,dst,show_table=0){
forindex(var x;src)
mat[y*src_len+x]=(src[x]==dst[y]);
- if(show_table){
+ if (show_table) {
var curve=[
["+---","| "],
["+---","| \\ "]
];
var s="";
- forindex(var y;dst){
- forindex(var t;curve[0]){
- forindex(var x;src){
+ forindex(var y;dst) {
+ forindex(var t;curve[0]) {
+ forindex(var x;src) {
s~=curve[mat[y*src_len+x]][t];
}
s~=["+","|"][t]~"\n";
@@ -40,23 +40,23 @@ var myers=func(src,dst,show_table=0){
var (total,path,vec)=([],[],[[0,0,-1]]);
visited[0]=1;
- while(size(vec)){
+ while(size(vec)) {
append(total,vec);
var tmp=[];
- forindex(var i;vec){
+ forindex(var i;vec) {
var elem=vec[i];
var (x,y)=(elem[1],elem[0]);
# find solution
- if(x==src_len-1 and y==dst_len-1){
+ if (x==src_len-1 and y==dst_len-1) {
append(path,vec[i]);
- for(var (prev,iter)=(elem[2],size(total)-1);iter>0;iter-=1){
+ for(var (prev,iter)=(elem[2],size(total)-1);iter>0;iter-=1) {
var t=total[iter-1][prev];
append(path,t);
prev=t[2];
}
- if(show_table){
+ if (show_table) {
for(var t=size(path)-1;t>=0;t-=1)
print("("~path[t][1]~","~path[t][0]~")",t==0?"":"->");
println();
@@ -66,16 +66,16 @@ var myers=func(src,dst,show_table=0){
for(var t=0;ty and y>0 and x>0 and 80>x and D>z[o]){
+ if (22>y and y>0 and x>0 and 80>x and D>z[o]) {
z[o]=D;
b[o]=chars[N>0?N:0];
}
@@ -49,8 +49,8 @@ var main=func(run_time){
}
}
-if(size(runtime.argv()) and !math.isnan(num(runtime.argv()[0]))){
+if (size(runtime.argv()) and !math.isnan(num(runtime.argv()[0]))) {
main(num(runtime.argv()[0]));
-}else{
+} else {
main(5e2);
}
\ No newline at end of file
diff --git a/test/exception.nas b/test/exception.nas
index 207e62b..a6160e6 100644
--- a/test/exception.nas
+++ b/test/exception.nas
@@ -1,22 +1,22 @@
var ResultTrait={
- Ok:func(val){
+ Ok:func(val) {
me.ok=val;
me.flag=0;
return me;
},
- Err:func(info){
+ Err:func(info) {
me.err=info;
me.flag=1;
return me;
},
- unwrap:func(){
- if(me.flag)
+ unwrap:func() {
+ if (me.flag)
die(me.err);
return me.ok;
}
};
-var Result=func(){
+var Result = func() {
return{
ok:nil,
err:"",
@@ -25,11 +25,11 @@ var Result=func(){
};
};
-var a=func(){
+var a = func() {
return Result().Ok("hello world");
}
-var b=func(){
+var b = func() {
return Result().Err("exception test");
}
diff --git a/test/feigenbaum.nas b/test/feigenbaum.nas
index e7aab39..009b8ad 100644
--- a/test/feigenbaum.nas
+++ b/test/feigenbaum.nas
@@ -37,12 +37,13 @@ var RGB = func(h, w) {
}
var progress = (h*width+w+1)/(width*height);
- if(progress*100-int(progress*100)==0){
+ if (progress*100-int(progress*100)==0) {
print(bar.bar(progress), " ", progress*100, "% \r");
}
var c = char(res);
return c~c~c;
}
+
ppm("feigenbaum.ppm", width, height, RGB);
println();
\ No newline at end of file
diff --git a/test/fib.nas b/test/fib.nas
index 49501cd..841ccca 100644
--- a/test/fib.nas
+++ b/test/fib.nas
@@ -1,8 +1,6 @@
-var fib=func(x)
-{
- if(x<2) return x;
+var fib = func(x) {
+ if (x<2) return x;
return fib(x-1)+fib(x-2);
}
for(var i=0;i<31;i+=1)
print(fib(i),'\n');
-
\ No newline at end of file
diff --git a/test/filesystem.nas b/test/filesystem.nas
index 87b6347..92d6521 100644
--- a/test/filesystem.nas
+++ b/test/filesystem.nas
@@ -1,5 +1,5 @@
-var files=func(path){
- if(!io.exists(path))
+var files = func(path) {
+ if (!io.exists(path))
return [];
var dd=unix.opendir(path);
var res=[];
@@ -8,30 +8,30 @@ var files=func(path){
unix.closedir(dd);
return res;
}
-var prt=func(s,path){
+var prt = func(s,path) {
var vec=files(path);
var last=size(vec)-1;
- forindex(var i;vec){
+ forindex(var i;vec) {
var f=vec[i];
- if(f=="." or f=="..")
+ if (f=="." or f=="..")
continue;
foreach(var j;s)
print("\e[34m",j,"\e[0m");
- if(unix.isdir(path~"/"~f)){
+ if (unix.isdir(path~"/"~f)) {
println("\e[34m",i==last?" └─":" ├─","\e[0m\e[33m[",f,"]\e[36m>\e[0m");
append(s,i==last?" ":" │ ");
prt(s,path~"/"~f);
pop(s);
- }elsif(unix.isfile(path~"/"~f)){
+ } elsif (unix.isfile(path~"/"~f)) {
println("\e[34m",i==last?" └─":" ├─","\e[0m\e[32m",f,"\e[0m");
- }else{
+ } else {
println("\e[34m",i==last?" └─":" ├─","\e[0m\e[91m",f,"\e[0m");
}
}
}
# enable unicode
-if(os.platform()=="windows")
+if (os.platform()=="windows")
system("chcp 65001");
println("\e[33m[",unix.getcwd(),"]\e[36m>\e[0m");
prt([""],".");
\ No newline at end of file
diff --git a/test/hexdump.nas b/test/hexdump.nas
index d77c15e..b90606d 100644
--- a/test/hexdump.nas
+++ b/test/hexdump.nas
@@ -4,7 +4,7 @@ use std.file;
use std.runtime;
# init
-var hex=func(){
+var hex = func() {
var hex_num=[
'0','1','2','3',
'4','5','6','7',
@@ -12,8 +12,8 @@ var hex=func(){
'c','d','e','f'
];
var res=[];
- foreach(var i;hex_num){
- foreach(var j;hex_num){
+ foreach(var i;hex_num) {
+ foreach(var j;hex_num) {
append(res,i~j);
}
}
@@ -21,11 +21,11 @@ var hex=func(){
}();
# read file
-var s=func(){
+var s = func() {
var filename = file.find_all_files_with_extension("./src","cpp","h");
- if(size(runtime.argv())!=0){
+ if (size(runtime.argv())!=0) {
var argv=runtime.argv();
- if(argv[0]=="-h" or argv[0]=="--h"){
+ if (argv[0]=="-h" or argv[0]=="--h") {
println("usage:");
println(" nasal hexdump.nas | get all files' hexdump.");
println(" nasal hexdump.nas [file] | get single file's hexdump.");
@@ -46,24 +46,24 @@ var cnt=0;
var hex_index=[0,0,0,0];
# print binary in text format
-var textprint=func(index){
+var textprint = func(index) {
var info="";
- if(os.platform()=="windows"){
+ if (os.platform()=="windows") {
for(var i=index-cnt;i=127)?".":chr(s[i]);
- }else{
+ } else {
for(var i=index-cnt;i=len)
+ var next = func() {
+ if (index+1>=len)
return index+1;
index+=1;
s=char(file_text[index]);
return index;
}
- var prev=func(){
+ var prev = func() {
index-=1;
s=char(file_text[index]);
}
- while(1){
- if(next()>=len)
+ while(1) {
+ if (next()>=len)
break;
- if(s==">")
+ if (s==">")
content~=">";
- elsif(s=="<")
+ elsif (s=="<")
content~="<";
- elsif(s=="[" or s=="]" or s=="(" or s==")" or s=="{" or s=="}")
+ elsif (s=="[" or s=="]" or s=="(" or s==")" or s=="{" or s=="}")
content~=""~s~"";
- elsif(s=="=" or s=="," or s==";" or s==":" or s=="|" or s=="&" or s=="!" or s=="?" or s=="+" or s=="-" or s=="*" or s=="/" or s=="~" or s==".")
+ elsif (s=="=" or s=="," or s==";" or s==":" or s=="|" or s=="&" or s=="!" or s=="?" or s=="+" or s=="-" or s=="*" or s=="/" or s=="~" or s==".")
content~=""~s~"";
- elsif(s=="_" or ("a"[0]<=s[0] and s[0]<="z"[0]) or ("A"[0]<=s[0] and s[0]<="Z"[0]) or s[0]<0 or s[0]>=128){
+ elsif (s=="_" or ("a"[0]<=s[0] and s[0]<="z"[0]) or ("A"[0]<=s[0] and s[0]<="Z"[0]) or s[0]<0 or s[0]>=128) {
var tmp=""~s; # generate a new string
- while(1){
- if(next()>=len)
+ while(1) {
+ if (next()>=len)
break;
- if(s=="_" or ("a"[0]<=s[0] and s[0]<="z"[0]) or ("A"[0]<=s[0] and s[0]<="Z"[0]) or ("0"[0]<=s[0] and s[0]<="9"[0]) or s[0]<0 or s[0]>=128)
+ if (s=="_" or ("a"[0]<=s[0] and s[0]<="z"[0]) or ("A"[0]<=s[0] and s[0]<="Z"[0]) or ("0"[0]<=s[0] and s[0]<="9"[0]) or s[0]<0 or s[0]>=128)
tmp~=s;
- else{
+ else {
prev();
break;
}
}
var is_key=0;
foreach(var i;keyword)
- if(tmp==i){
+ if (tmp==i) {
is_key=1;
content~=""~tmp~"";
break;
}
- if(!is_key)
+ if (!is_key)
content~=""~tmp~"";
- }elsif("0"[0]<=s[0] and s[0]<="9"[0]){
+ } elsif ("0"[0]<=s[0] and s[0]<="9"[0]) {
content~=""~s;
- if(next()>=len){
+ if (next()>=len) {
content~="";
break;
}
- if(s=="o"){
+ if (s=="o") {
content~="o";
- while(1){
- if(next()>=len)
+ while(1) {
+ if (next()>=len)
break;
- if("0"[0]<=s[0] and s[0]<="7"[0])
+ if ("0"[0]<=s[0] and s[0]<="7"[0])
content~=s;
else
break;
}
content~="";
prev();
- }elsif(s=="x"){
+ } elsif (s=="x") {
content~="x";
- while(1){
- if(next()>=len)
+ while(1) {
+ if (next()>=len)
break;
- if(("0"[0]<=s[0] and s[0]<="9"[0]) or ("a"[0]<=s[0] and s[0]<='f') or ("A"[0]<=s[0] or s[0]<="F"))
+ if (("0"[0]<=s[0] and s[0]<="9"[0]) or ("a"[0]<=s[0] and s[0]<='f') or ("A"[0]<=s[0] or s[0]<="F"))
content~=s;
else
break;
}
content~="";
prev();
- }elsif(("0"[0]<=s[0] and s[0]<="9"[0]) or s=="." or s=="e"){
- while("0"[0]<=s[0] and s[0]<="9"[0]){
+ } elsif (("0"[0]<=s[0] and s[0]<="9"[0]) or s=="." or s=="e") {
+ while("0"[0]<=s[0] and s[0]<="9"[0]) {
content~=s;
- if(next()>=len)
+ if (next()>=len)
break;
}
- if(s=="."){
+ if (s==".") {
content~=s;
- if(next()>=len)
+ if (next()>=len)
break;
}
- while("0"[0]<=s[0] and s[0]<="9"[0]){
+ while("0"[0]<=s[0] and s[0]<="9"[0]) {
content~=s;
- if(next()>=len)
+ if (next()>=len)
break;
}
- if(s=="e"){
+ if (s=="e") {
content~=s;
- if(next()>=len)
+ if (next()>=len)
break;
- if(s=="-" or s=="+"){
+ if (s=="-" or s=="+") {
content~=s;
- if(next()>=len)
+ if (next()>=len)
break;
}
}
- while("0"[0]<=s[0] and s[0]<="9"[0]){
+ while("0"[0]<=s[0] and s[0]<="9"[0]) {
content~=s;
- if(next()>=len)
+ if (next()>=len)
break;
}
prev();
content~="";
- }else{
+ } else {
prev();
content~="";
}
- }elsif(s=="\"" or s=="'" or s=="`"){
+ } elsif (s=="\"" or s=="'" or s=="`") {
var quot=s~""; # generate a new string
content~=""~s;
- while(1){
- if(next()>=len)
+ while(1) {
+ if (next()>=len)
break;
- if(s==quot){
+ if (s==quot) {
content~=s~"";
break;
- }elsif(s=="\\"){
+ } elsif (s=="\\") {
content~=s;
- if(next()>=len)
+ if (next()>=len)
break;
content~=s;
- }elsif(s==">"){
+ } elsif (s==">") {
content~=">";
- }elsif(s=="<"){
+ } elsif (s=="<") {
content~="<";
- }else{
+ } else {
content~=s;
}
}
- }elsif(s=="#"){
+ } elsif (s=="#") {
content~=""~s;
- while(1){
- if(next()>=len)
+ while(1) {
+ if (next()>=len)
break;
- if(s=="\n" or s=="\r"){
+ if (s=="\n" or s=="\r") {
content~=s;
break;
- }elsif(s==">"){
+ } elsif (s==">") {
content~=">";
- }elsif(s=="<"){
+ } elsif (s=="<") {
content~="<";
- }else{
+ } else {
content~=s;
}
}
@@ -242,11 +242,11 @@ var html_read_file=func(filename){
}
var respond={
- ok:func(html){
+ ok:func(html) {
println("[",os.time(),"] respond 200 OK");
return "Http/1.1 200 OK\n\n"~html~"\n";
},
- not_found:func(){
+ not_found:func() {
println("[",os.time(),"] respond 404 NOT FOUND");
return "Http/1.1 404 NOT FOUND\n\n
@@ -260,7 +260,7 @@ var respond={