From bbed29eb65f804421c499ae18f48f8e6efdc5cd8 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Thu, 26 Oct 2023 00:04:20 +0800 Subject: [PATCH] :sparkles: add native function `ceil` --- src/nasal_builtin.cpp | 6 ++++++ src/nasal_builtin.h | 1 + std/json.nas | 45 ++++++++++++++++++++++++++----------------- std/lib.nas | 40 +++++++++++++++++++++++--------------- 4 files changed, 59 insertions(+), 33 deletions(-) diff --git a/src/nasal_builtin.cpp b/src/nasal_builtin.cpp index 6bdaf9c..47c13d6 100644 --- a/src/nasal_builtin.cpp +++ b/src/nasal_builtin.cpp @@ -157,6 +157,11 @@ var builtin_floor(context* ctx, gc* ngc) { return var::num(std::floor(value.num())); } +var builtin_ceil(context* ctx, gc* ngc) { + auto value = ctx->localr[1]; + return var::num(std::ceil(value.num())); +} + var builtin_num(context* ctx, gc* ngc) { auto val = ctx->localr[1]; if (val.type==vm_num) { @@ -653,6 +658,7 @@ nasal_builtin_table builtin[] = { {"__id", builtin_id}, {"__int", builtin_int}, {"__floor", builtin_floor}, + {"__ceil", builtin_ceil}, {"__num", builtin_num}, {"__pop", builtin_pop}, {"__str", builtin_str}, diff --git a/src/nasal_builtin.h b/src/nasal_builtin.h index 00f0878..d7c3dd5 100644 --- a/src/nasal_builtin.h +++ b/src/nasal_builtin.h @@ -42,6 +42,7 @@ var builtin_rand(context*, gc*); var builtin_id(context*, gc*); var builtin_int(context*, gc*); var builtin_floor(context*, gc*); +var builtin_ceil(context*, gc*); var builtin_num(context*, gc*); var builtin_pop(context*, gc*); var builtin_str(context*, gc*); diff --git a/std/json.nas b/std/json.nas index d656ed0..8327b55 100644 --- a/std/json.nas +++ b/std/json.nas @@ -2,8 +2,16 @@ # 2021 ValKmjolnir var ( - _j_eof, _j_lbrace, _j_rbrace, _j_lbrkt, _j_rbrkt, - _j_comma, _j_colon, _j_str, _j_num, _j_id + _j_eof, + _j_lbrace, + _j_rbrace, + _j_lbrkt, + _j_rbrkt, + _j_comma, + _j_colon, + _j_str, + _j_num, + _j_id ) = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9); var _j_content = [ @@ -146,28 +154,29 @@ 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,"`."); + } next(); return; } var member = func(hash) { var name = token.content; - if(token.type==_j_rbrace) { + if (token.type==_j_rbrace) { return; } - if(token.type==_j_str) { + if (token.type==_j_str) { match(_j_str); } else { match(_j_id); } match(_j_colon); - if(token.type==_j_lbrace) { + if (token.type==_j_lbrace) { hash[name] = hash_gen(); - } elsif(token.type==_j_lbrkt) { + } elsif (token.type==_j_lbrkt) { hash[name] = vec_gen(); - } elsif(token.type==_j_str or token.type==_j_num) { + } elsif (token.type==_j_str or token.type==_j_num) { hash[name] = token.content; next(); } @@ -189,21 +198,21 @@ var parse = func() { var vec_gen = func() { var vec = []; match(_j_lbrkt); - if(token.type==_j_lbrace) { + if (token.type==_j_lbrace) { append(vec, hash_gen()); - } elsif(token.type==_j_lbrkt) { + } elsif (token.type==_j_lbrkt) { append(vec, vec_gen()); - } elsif(token.type==_j_str or token.type==_j_num) { + } elsif (token.type==_j_str or token.type==_j_num) { append(vec, token.content); next(); } while(token.type==_j_comma) { match(_j_comma); - if(token.type==_j_lbrace) { + if (token.type==_j_lbrace) { append(vec, hash_gen()); - } elsif(token.type==_j_lbrkt) { + } elsif (token.type==_j_lbrkt) { append(vec, vec_gen()); - } elsif(token.type==_j_str or token.type==_j_num) { + } elsif (token.type==_j_str or token.type==_j_num) { append(vec, token.content); next(); } @@ -242,13 +251,13 @@ var stringify = func(object) { var s = ""; var gen = func(elem) { var t = typeof(elem); - if(t=="num") { + if (t=="num") { s ~= str(elem); - } elsif(t=="str") { + } elsif (t=="str") { s ~= '"'~elem~'"'; - } elsif(t=="vec") { + } elsif (t=="vec") { vgen(elem); - } elsif(t=="hash") { + } elsif (t=="hash") { hgen(elem); } else { s ~= '"undefined"'; diff --git a/std/lib.nas b/std/lib.nas index 0bf6646..95cb4a6 100644 --- a/std/lib.nas +++ b/std/lib.nas @@ -75,6 +75,10 @@ var floor = func(val) { return __floor(val); } +var ceil = func(val) { + return __ceil(val); +} + # exit using std::exit var exit = func(val = -1) { return __exit(val); @@ -228,19 +232,21 @@ var println = func(elems...) { # sort function using quick sort # not very efficient... :( -var sort = func(){ +var sort = func() { srand(); # be aware! this causes global changes var quick_sort_core = func(vec, left, right, cmp) { 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