🎨 format
This commit is contained in:
parent
2cc5bb8625
commit
af3d93ab64
28
doc/dev.md
28
doc/dev.md
|
@ -40,15 +40,15 @@ These two expressions have the same first set,so `LL(1)` is useless for this lan
|
||||||
Problems mentioned above have been solved for a long time, but recently i found a new problem here:
|
Problems mentioned above have been solved for a long time, but recently i found a new problem here:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var f=func(x,y,z){return x+y+z}
|
var f = func(x, y, z) { return x + y + z }
|
||||||
(a,b,c)=(0,1,2);
|
(a, b, c) = (0, 1, 2);
|
||||||
```
|
```
|
||||||
|
|
||||||
This will be recognized as this:
|
This will be recognized as this:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var f=func(x,y,z){return x+y+z}(a,b,c)
|
var f = func(x, y, z) { return x + y + z }(a, b, c)
|
||||||
=(0,1,2);
|
= (0, 1, 2);
|
||||||
```
|
```
|
||||||
|
|
||||||
and causes fatal syntax error.
|
and causes fatal syntax error.
|
||||||
|
@ -58,9 +58,9 @@ I think this is a serious design fault.
|
||||||
To avoid this syntax error, change program like this, just add a semicolon:
|
To avoid this syntax error, change program like this, just add a semicolon:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var f=func(x,y,z){return x+y+z};
|
var f = func(x, y, z) { return x + y + z };
|
||||||
^ here
|
^ here
|
||||||
(a,b,c)=(0,1,2);
|
(a, b, c) = (0, 1, 2);
|
||||||
```
|
```
|
||||||
|
|
||||||
### version 1.0 parser (last update 2019/10/14)
|
### version 1.0 parser (last update 2019/10/14)
|
||||||
|
@ -222,8 +222,8 @@ Better use `callfv` instead of `callfh`,
|
||||||
making this process slow.
|
making this process slow.
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var f=func(x,y){return x+y;}
|
var f = func(x, y) { return x + y; }
|
||||||
f(1024,2048);
|
f(1024, 2048);
|
||||||
```
|
```
|
||||||
|
|
||||||
```x86asm
|
```x86asm
|
||||||
|
@ -530,12 +530,12 @@ func <0x2a3>:
|
||||||
Now we add coroutine in this runtime:
|
Now we add coroutine in this runtime:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var coroutine={
|
var coroutine = {
|
||||||
create: func(function){return __cocreate;},
|
create: func(function) { return __cocreate; },
|
||||||
resume: func(co) {return __coresume;},
|
resume: func(co) { return __coresume; },
|
||||||
yield: func(args...) {return __coyield; },
|
yield: func(args...) { return __coyield; },
|
||||||
status: func(co) {return __costatus;},
|
status: func(co) { return __costatus; },
|
||||||
running:func() {return __corun; }
|
running: func() { return __corun; }
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -40,23 +40,23 @@
|
||||||
上面这个问题已经解决很久了,不过我最近发现了一个新的语法问题:
|
上面这个问题已经解决很久了,不过我最近发现了一个新的语法问题:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var f=func(x,y,z){return x+y+z}
|
var f = func(x, y, z) { return x + y + z }
|
||||||
(a,b,c)=(0,1,2);
|
(a, b, c) = (0, 1, 2);
|
||||||
```
|
```
|
||||||
|
|
||||||
这种写法会被错误识别合并成下面这种:
|
这种写法会被错误识别合并成下面这种:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var f=func(x,y,z){return x+y+z}(a,b,c)
|
var f = func(x, y, z) { return x + y + z }(a, b, c)
|
||||||
=(0,1,2);
|
= (0, 1, 2);
|
||||||
```
|
```
|
||||||
|
|
||||||
语法分析器会认为这是个严重的语法错误。我在Flightgear中也测试了这个代码,它内置的语法分析器也认为这是错误语法。当然我认为这是语法设计中的一个比较严重的缺漏。为了避免这个语法问题,只需要添加一个分号就可以了:
|
语法分析器会认为这是个严重的语法错误。我在Flightgear中也测试了这个代码,它内置的语法分析器也认为这是错误语法。当然我认为这是语法设计中的一个比较严重的缺漏。为了避免这个语法问题,只需要添加一个分号就可以了:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var f=func(x,y,z){return x+y+z};
|
var f = func(x, y, z) { return x + y + z };
|
||||||
^ 就是这里
|
^ 就是这里
|
||||||
(a,b,c)=(0,1,2);
|
(a, b, c) = (0, 1, 2);
|
||||||
```
|
```
|
||||||
|
|
||||||
### version 1.0 parser (last update 2019/10/14)
|
### version 1.0 parser (last update 2019/10/14)
|
||||||
|
@ -193,15 +193,15 @@ for (var i=0;i<4000000;i+=1);
|
||||||
|
|
||||||
2021/6/3 update:
|
2021/6/3 update:
|
||||||
|
|
||||||
修复了垃圾收集器还是他妈的会重复收集的bug,这次我设计了三个标记状态来保证垃圾是被正确收集了。
|
修复了垃圾收集器还是会重复收集的bug,这次我设计了三个标记状态来保证垃圾是被正确收集了。
|
||||||
|
|
||||||
将`callf`指令拆分为`callfv`和`callfh`。并且`callfv`将直接从`val_stack`获取传参,而不是先通过一个`vm_vec`把参数收集起来再传入,后者是非常低效的做法。
|
将`callf`指令拆分为`callfv`和`callfh`。并且`callfv`将直接从`val_stack`获取传参,而不是先通过一个`vm_vec`把参数收集起来再传入,后者是非常低效的做法。
|
||||||
|
|
||||||
建议更多使用`callfv`而不是`callfh`,因为`callfh`只能从栈上获取参数并整合为`vm_hash`之后才能传给该指令进行处理,拖慢执行速度。
|
建议更多使用`callfv`而不是`callfh`,因为`callfh`只能从栈上获取参数并整合为`vm_hash`之后才能传给该指令进行处理,拖慢执行速度。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var f=func(x,y){return x+y;}
|
var f = func(x, y) { return x + y; }
|
||||||
f(1024,2048);
|
f(1024, 2048);
|
||||||
```
|
```
|
||||||
|
|
||||||
```x86asm
|
```x86asm
|
||||||
|
@ -475,12 +475,12 @@ func <0x2a3>:
|
||||||
在这个版本中我们给nasal加入了协程:
|
在这个版本中我们给nasal加入了协程:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var coroutine={
|
var coroutine = {
|
||||||
create: func(function){return __cocreate;},
|
create: func(function) { return __cocreate; },
|
||||||
resume: func(co) {return __coresume;},
|
resume: func(co) { return __coresume; },
|
||||||
yield: func(args...) {return __coyield; },
|
yield: func(args...) { return __coyield; },
|
||||||
status: func(co) {return __costatus;},
|
status: func(co) { return __costatus; },
|
||||||
running:func() {return __corun; }
|
running: func() { return __corun; }
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ __`vec`__ has unlimited length and can store all types of values.
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var vec = [];
|
var vec = [];
|
||||||
var vec = [0, nil, {}, [], func(){return 0}];
|
var vec = [0, nil, {}, [], func() { return 0 }];
|
||||||
append(vec, 0, 1, 2);
|
append(vec, 0, 1, 2);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -255,7 +255,7 @@ if (1) {
|
||||||
While loop and for loop is simalar to C/C++.
|
While loop and for loop is simalar to C/C++.
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
while(condition) {
|
while (condition) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
for (var i = 0; i<10; i += 1) {
|
for (var i = 0; i<10; i += 1) {
|
||||||
|
@ -327,7 +327,7 @@ var fib = func(f) {
|
||||||
}(
|
}(
|
||||||
func(f) {
|
func(f) {
|
||||||
return func(x) {
|
return func(x) {
|
||||||
if(x<2) return x;
|
if (x<2) return x;
|
||||||
return f(f)(x-1)+f(f)(x-2);
|
return f(f)(x-1)+f(f)(x-2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -597,7 +597,7 @@ var fib(var* args, usize size, gc* ngc) {
|
||||||
// if you want your function safer, try this
|
// if you want your function safer, try this
|
||||||
// nas_err will print the error info on screen
|
// nas_err will print the error info on screen
|
||||||
// and return vm_null for runtime to interrupt
|
// and return vm_null for runtime to interrupt
|
||||||
if(num.type!=vm_num) {
|
if (num.type!=vm_num) {
|
||||||
return nas_err("extern_fib", "\"num\" must be number");
|
return nas_err("extern_fib", "\"num\" must be number");
|
||||||
}
|
}
|
||||||
// ok, you must know that vm_num now is not managed by gc
|
// ok, you must know that vm_num now is not managed by gc
|
||||||
|
|
|
@ -64,7 +64,7 @@ __`vec`__ 有不受限制的长度并且可以存储所有类型的数据。(当
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var vec = [];
|
var vec = [];
|
||||||
var vec = [0, nil, {}, [], func(){return 0}];
|
var vec = [0, nil, {}, [], func() { return 0 }];
|
||||||
append(vec, 0, 1, 2);
|
append(vec, 0, 1, 2);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -247,7 +247,7 @@ if (1) {
|
||||||
while循环和for循环大体上与C/C++是一致的。
|
while循环和for循环大体上与C/C++是一致的。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
while(condition) {
|
while (condition) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
for (var i = 0; i<10; i += 1) {
|
for (var i = 0; i<10; i += 1) {
|
||||||
|
@ -314,7 +314,7 @@ var fib = func(f) {
|
||||||
}(
|
}(
|
||||||
func(f) {
|
func(f) {
|
||||||
return func(x) {
|
return func(x) {
|
||||||
if(x<2) return x;
|
if (x<2) return x;
|
||||||
return f(f)(x-1)+f(f)(x-2);
|
return f(f)(x-1)+f(f)(x-2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -579,7 +579,7 @@ var fib(var* args, usize size, gc* ngc) {
|
||||||
var num = args[0];
|
var num = args[0];
|
||||||
// 如果你想让这个函数有更强的稳定性,那么一定要进行合法性检查
|
// 如果你想让这个函数有更强的稳定性,那么一定要进行合法性检查
|
||||||
// nas_err会输出错误信息并返回错误类型让虚拟机终止执行
|
// nas_err会输出错误信息并返回错误类型让虚拟机终止执行
|
||||||
if(num.type!=vm_num) {
|
if (num.type!=vm_num) {
|
||||||
return nas_err("extern_fib", "\"num\" must be number");
|
return nas_err("extern_fib", "\"num\" must be number");
|
||||||
}
|
}
|
||||||
// vm_num作为普通的数字类型,不是内存管理的对象,所以无需申请
|
// vm_num作为普通的数字类型,不是内存管理的对象,所以无需申请
|
||||||
|
|
|
@ -157,7 +157,7 @@ void unary_operator::accept(ast_visitor* visitor) {
|
||||||
}
|
}
|
||||||
|
|
||||||
call_expr::~call_expr() {
|
call_expr::~call_expr() {
|
||||||
if(first) {
|
if (first) {
|
||||||
delete first;
|
delete first;
|
||||||
}
|
}
|
||||||
for (auto i : calls) {
|
for (auto i : calls) {
|
||||||
|
|
|
@ -291,7 +291,7 @@ void codegen::func_gen(function* node) {
|
||||||
// var f = func(a, arg...) {return(arg)}
|
// var f = func(a, arg...) {return(arg)}
|
||||||
auto arg = std::string("arg");
|
auto arg = std::string("arg");
|
||||||
// this is used to avoid confliction with defined parameter
|
// this is used to avoid confliction with defined parameter
|
||||||
while(local_symbol_find(arg)>=0) {
|
while (local_symbol_find(arg)>=0) {
|
||||||
arg = "0" + arg;
|
arg = "0" + arg;
|
||||||
}
|
}
|
||||||
regist_symbol(arg);
|
regist_symbol(arg);
|
||||||
|
|
|
@ -95,7 +95,7 @@ void operand_line_counter::dump_this_file_line_counter(std::ostream& os) const {
|
||||||
std::vector<std::string> dbg::parse(const std::string& cmd) {
|
std::vector<std::string> dbg::parse(const std::string& cmd) {
|
||||||
std::vector<std::string> res;
|
std::vector<std::string> res;
|
||||||
usize last = 0, pos = cmd.find(" ", 0);
|
usize last = 0, pos = cmd.find(" ", 0);
|
||||||
while(pos!=std::string::npos) {
|
while (pos!=std::string::npos) {
|
||||||
if (pos>last) {
|
if (pos>last) {
|
||||||
res.push_back(cmd.substr(last, pos-last));
|
res.push_back(cmd.substr(last, pos-last));
|
||||||
}
|
}
|
||||||
|
@ -202,7 +202,7 @@ void dbg::interact() {
|
||||||
next = false;
|
next = false;
|
||||||
std::string cmd;
|
std::string cmd;
|
||||||
step_info();
|
step_info();
|
||||||
while(true) {
|
while (true) {
|
||||||
std::clog << ">> ";
|
std::clog << ">> ";
|
||||||
std::getline(std::cin, cmd);
|
std::getline(std::cin, cmd);
|
||||||
auto res = parse(cmd);
|
auto res = parse(cmd);
|
||||||
|
@ -279,7 +279,7 @@ void dbg::run(const codegen& gen,
|
||||||
code_line.push_back(i.line);
|
code_line.push_back(i.line);
|
||||||
imm.push_back(i.num);
|
imm.push_back(i.num);
|
||||||
}
|
}
|
||||||
while(operand_function[code[ctx.pc]]) {
|
while (operand_function[code[ctx.pc]]) {
|
||||||
interact();
|
interact();
|
||||||
counter.add_operand_counter(code[ctx.pc]);
|
counter.add_operand_counter(code[ctx.pc]);
|
||||||
counter.add_code_line_counter(code_file_index[ctx.pc], code_line[ctx.pc]);
|
counter.add_code_line_counter(code_file_index[ctx.pc], code_line[ctx.pc]);
|
||||||
|
|
|
@ -150,7 +150,7 @@ void filestream::load(const std::string& f) {
|
||||||
std::exit(1);
|
std::exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
while(!in.eof()) {
|
while (!in.eof()) {
|
||||||
std::string line;
|
std::string line;
|
||||||
std::getline(in, line);
|
std::getline(in, line);
|
||||||
res.push_back(line);
|
res.push_back(line);
|
||||||
|
|
|
@ -54,7 +54,7 @@ private:
|
||||||
}
|
}
|
||||||
std::string leftpad(u64 num, usize len) {
|
std::string leftpad(u64 num, usize len) {
|
||||||
auto tmp = std::to_string(num);
|
auto tmp = std::to_string(num);
|
||||||
while(tmp.length()<len) {
|
while (tmp.length()<len) {
|
||||||
tmp = " "+tmp;
|
tmp = " "+tmp;
|
||||||
}
|
}
|
||||||
return tmp;
|
return tmp;
|
||||||
|
|
|
@ -45,7 +45,7 @@ void gc::mark() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// normal mark
|
// normal mark
|
||||||
while(!bfs.empty()) {
|
while (!bfs.empty()) {
|
||||||
var value = bfs.back();
|
var value = bfs.back();
|
||||||
bfs.pop_back();
|
bfs.pop_back();
|
||||||
if (value.type<=vm_type::vm_num ||
|
if (value.type<=vm_type::vm_num ||
|
||||||
|
@ -66,7 +66,7 @@ void gc::concurrent_mark(std::vector<var>& vec, usize begin, usize end) {
|
||||||
}
|
}
|
||||||
mark_var(bfs, value);
|
mark_var(bfs, value);
|
||||||
}
|
}
|
||||||
while(!bfs.empty()) {
|
while (!bfs.empty()) {
|
||||||
var value = bfs.back();
|
var value = bfs.back();
|
||||||
bfs.pop_back();
|
bfs.pop_back();
|
||||||
if (value.type<=vm_type::vm_num ||
|
if (value.type<=vm_type::vm_num ||
|
||||||
|
|
|
@ -19,7 +19,7 @@ linker::linker(): show_path_flag(false), this_file("") {
|
||||||
const auto seperator = util::is_windows()? ';':':';
|
const auto seperator = util::is_windows()? ';':':';
|
||||||
const auto PATH = std::string(env_get_path);
|
const auto PATH = std::string(env_get_path);
|
||||||
usize last = 0, position = PATH.find(seperator, 0);
|
usize last = 0, position = PATH.find(seperator, 0);
|
||||||
while(position!=std::string::npos) {
|
while (position!=std::string::npos) {
|
||||||
std::string dirpath = PATH.substr(last, position-last);
|
std::string dirpath = PATH.substr(last, position-last);
|
||||||
if (dirpath.length()) {
|
if (dirpath.length()) {
|
||||||
envpath.push_back(dirpath);
|
envpath.push_back(dirpath);
|
||||||
|
|
|
@ -59,7 +59,7 @@ bool lexer::is_calc_opr(char c) {
|
||||||
void lexer::skip_note() {
|
void lexer::skip_note() {
|
||||||
// avoid note, after this process ptr will point to '\n'
|
// avoid note, after this process ptr will point to '\n'
|
||||||
// so next loop line counter+1
|
// so next loop line counter+1
|
||||||
while(++ptr<res.size() && res[ptr]!='\n') {}
|
while (++ptr<res.size() && res[ptr]!='\n') {}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lexer::err_char() {
|
void lexer::err_char() {
|
||||||
|
@ -114,7 +114,7 @@ tok lexer::get_type(const std::string& str) {
|
||||||
|
|
||||||
std::string lexer::utf8_gen() {
|
std::string lexer::utf8_gen() {
|
||||||
std::string str = "";
|
std::string str = "";
|
||||||
while(ptr<res.size() && res[ptr]<0) {
|
while (ptr<res.size() && res[ptr]<0) {
|
||||||
std::string tmp = "";
|
std::string tmp = "";
|
||||||
u32 nbytes = util::utf8_hdchk(res[ptr]);
|
u32 nbytes = util::utf8_hdchk(res[ptr]);
|
||||||
if (!nbytes) {
|
if (!nbytes) {
|
||||||
|
@ -154,7 +154,7 @@ token lexer::id_gen() {
|
||||||
u64 begin_line = line;
|
u64 begin_line = line;
|
||||||
u64 begin_column = column;
|
u64 begin_column = column;
|
||||||
std::string str = "";
|
std::string str = "";
|
||||||
while(ptr<res.size() && (is_id(res[ptr]) || is_dec(res[ptr]))) {
|
while (ptr<res.size() && (is_id(res[ptr]) || is_dec(res[ptr]))) {
|
||||||
if (res[ptr]<0) { // utf-8
|
if (res[ptr]<0) { // utf-8
|
||||||
str += utf8_gen();
|
str += utf8_gen();
|
||||||
} else { // ascii
|
} else { // ascii
|
||||||
|
@ -177,7 +177,7 @@ token lexer::num_gen() {
|
||||||
if (ptr+1<res.size() && res[ptr]=='0' && res[ptr+1]=='x') {
|
if (ptr+1<res.size() && res[ptr]=='0' && res[ptr+1]=='x') {
|
||||||
std::string str = "0x";
|
std::string str = "0x";
|
||||||
ptr += 2;
|
ptr += 2;
|
||||||
while(ptr<res.size() && is_hex(res[ptr])) {
|
while (ptr<res.size() && is_hex(res[ptr])) {
|
||||||
str += res[ptr++];
|
str += res[ptr++];
|
||||||
}
|
}
|
||||||
column += str.length();
|
column += str.length();
|
||||||
|
@ -196,11 +196,11 @@ token lexer::num_gen() {
|
||||||
} else if (ptr+1<res.size() && res[ptr]=='0' && res[ptr+1]=='o') { // generate oct number
|
} else if (ptr+1<res.size() && res[ptr]=='0' && res[ptr+1]=='o') { // generate oct number
|
||||||
std::string str = "0o";
|
std::string str = "0o";
|
||||||
ptr += 2;
|
ptr += 2;
|
||||||
while(ptr<res.size() && is_oct(res[ptr])) {
|
while (ptr<res.size() && is_oct(res[ptr])) {
|
||||||
str += res[ptr++];
|
str += res[ptr++];
|
||||||
}
|
}
|
||||||
bool erfmt = false;
|
bool erfmt = false;
|
||||||
while(ptr<res.size() && (is_dec(res[ptr]) || is_hex(res[ptr]))) {
|
while (ptr<res.size() && (is_dec(res[ptr]) || is_hex(res[ptr]))) {
|
||||||
erfmt = true;
|
erfmt = true;
|
||||||
str += res[ptr++];
|
str += res[ptr++];
|
||||||
}
|
}
|
||||||
|
@ -220,12 +220,12 @@ token lexer::num_gen() {
|
||||||
// generate dec number
|
// generate dec number
|
||||||
// dec number -> [0~9][0~9]*(.[0~9]*)(e|E(+|-)0|[1~9][0~9]*)
|
// dec number -> [0~9][0~9]*(.[0~9]*)(e|E(+|-)0|[1~9][0~9]*)
|
||||||
std::string str = "";
|
std::string str = "";
|
||||||
while(ptr<res.size() && is_dec(res[ptr])) {
|
while (ptr<res.size() && is_dec(res[ptr])) {
|
||||||
str += res[ptr++];
|
str += res[ptr++];
|
||||||
}
|
}
|
||||||
if (ptr<res.size() && res[ptr]=='.') {
|
if (ptr<res.size() && res[ptr]=='.') {
|
||||||
str += res[ptr++];
|
str += res[ptr++];
|
||||||
while(ptr<res.size() && is_dec(res[ptr])) {
|
while (ptr<res.size() && is_dec(res[ptr])) {
|
||||||
str += res[ptr++];
|
str += res[ptr++];
|
||||||
}
|
}
|
||||||
// "xxxx." is not a correct number
|
// "xxxx." is not a correct number
|
||||||
|
@ -247,7 +247,7 @@ token lexer::num_gen() {
|
||||||
if (ptr<res.size() && (res[ptr]=='-' || res[ptr]=='+')) {
|
if (ptr<res.size() && (res[ptr]=='-' || res[ptr]=='+')) {
|
||||||
str += res[ptr++];
|
str += res[ptr++];
|
||||||
}
|
}
|
||||||
while(ptr<res.size() && is_dec(res[ptr])) {
|
while (ptr<res.size() && is_dec(res[ptr])) {
|
||||||
str += res[ptr++];
|
str += res[ptr++];
|
||||||
}
|
}
|
||||||
// "xxxe(-|+)" is not a correct number
|
// "xxxe(-|+)" is not a correct number
|
||||||
|
@ -278,7 +278,7 @@ token lexer::str_gen() {
|
||||||
std::string str = "";
|
std::string str = "";
|
||||||
const char begin = res[ptr];
|
const char begin = res[ptr];
|
||||||
++column;
|
++column;
|
||||||
while(++ptr<res.size() && res[ptr]!=begin) {
|
while (++ptr<res.size() && res[ptr]!=begin) {
|
||||||
++column;
|
++column;
|
||||||
if (res[ptr]=='\n') {
|
if (res[ptr]=='\n') {
|
||||||
column = 0;
|
column = 0;
|
||||||
|
@ -404,8 +404,8 @@ const error& lexer::scan(const std::string& file) {
|
||||||
toks = {};
|
toks = {};
|
||||||
open(file);
|
open(file);
|
||||||
|
|
||||||
while(ptr<res.size()) {
|
while (ptr<res.size()) {
|
||||||
while(ptr<res.size() && skip(res[ptr])) {
|
while (ptr<res.size() && skip(res[ptr])) {
|
||||||
// these characters will be ignored, and '\n' will cause ++line
|
// these characters will be ignored, and '\n' will cause ++line
|
||||||
++column;
|
++column;
|
||||||
if (res[ptr++]=='\n') {
|
if (res[ptr++]=='\n') {
|
||||||
|
|
|
@ -10,7 +10,7 @@ const error& parse::compile(const lexer& lexer) {
|
||||||
|
|
||||||
root = new code_block(toks[0].loc);
|
root = new code_block(toks[0].loc);
|
||||||
|
|
||||||
while(!lookahead(tok::tk_eof)) {
|
while (!lookahead(tok::tk_eof)) {
|
||||||
root->add_expression(expression());
|
root->add_expression(expression());
|
||||||
if (lookahead(tok::tk_semi)) {
|
if (lookahead(tok::tk_semi)) {
|
||||||
match(tok::tk_semi);
|
match(tok::tk_semi);
|
||||||
|
@ -114,7 +114,7 @@ bool parse::check_comma(const tok* panic_set) {
|
||||||
|
|
||||||
bool parse::check_tuple() {
|
bool parse::check_tuple() {
|
||||||
u64 check_ptr = ptr, curve = 1, bracket = 0, brace = 0;
|
u64 check_ptr = ptr, curve = 1, bracket = 0, brace = 0;
|
||||||
while(toks[++check_ptr].type!=tok::tk_eof && curve) {
|
while (toks[++check_ptr].type!=tok::tk_eof && curve) {
|
||||||
switch(toks[check_ptr].type) {
|
switch(toks[check_ptr].type) {
|
||||||
case tok::tk_lcurve: ++curve; break;
|
case tok::tk_lcurve: ++curve; break;
|
||||||
case tok::tk_lbracket: ++bracket; break;
|
case tok::tk_lbracket: ++bracket; break;
|
||||||
|
@ -167,7 +167,7 @@ bool parse::check_in_curve_multi_definition() {
|
||||||
bool parse::check_special_call() {
|
bool parse::check_special_call() {
|
||||||
// special call means like this: function_name(a:1, b:2, c:3);
|
// special call means like this: function_name(a:1, b:2, c:3);
|
||||||
u64 check_ptr = ptr, curve = 1, bracket = 0, brace = 0;
|
u64 check_ptr = ptr, curve = 1, bracket = 0, brace = 0;
|
||||||
while(toks[++check_ptr].type!=tok::tk_eof && curve) {
|
while (toks[++check_ptr].type!=tok::tk_eof && curve) {
|
||||||
switch(toks[check_ptr].type) {
|
switch(toks[check_ptr].type) {
|
||||||
case tok::tk_lcurve: ++curve; break;
|
case tok::tk_lcurve: ++curve; break;
|
||||||
case tok::tk_lbracket: ++bracket;break;
|
case tok::tk_lbracket: ++bracket;break;
|
||||||
|
@ -216,7 +216,7 @@ use_stmt* parse::use_stmt_gen() {
|
||||||
auto node = new use_stmt(toks[ptr].loc);
|
auto node = new use_stmt(toks[ptr].loc);
|
||||||
match(tok::tk_use);
|
match(tok::tk_use);
|
||||||
node->add_path(id());
|
node->add_path(id());
|
||||||
while(lookahead(tok::tk_dot)) {
|
while (lookahead(tok::tk_dot)) {
|
||||||
match(tok::tk_dot);
|
match(tok::tk_dot);
|
||||||
node->add_path(id());
|
node->add_path(id());
|
||||||
}
|
}
|
||||||
|
@ -276,7 +276,7 @@ vector_expr* parse::vec() {
|
||||||
};
|
};
|
||||||
auto node = new vector_expr(toks[ptr].loc);
|
auto node = new vector_expr(toks[ptr].loc);
|
||||||
match(tok::tk_lbracket);
|
match(tok::tk_lbracket);
|
||||||
while(!lookahead(tok::tk_rbracket)) {
|
while (!lookahead(tok::tk_rbracket)) {
|
||||||
node->add_element(calc());
|
node->add_element(calc());
|
||||||
if (lookahead(tok::tk_comma)) {
|
if (lookahead(tok::tk_comma)) {
|
||||||
match(tok::tk_comma);
|
match(tok::tk_comma);
|
||||||
|
@ -294,7 +294,7 @@ vector_expr* parse::vec() {
|
||||||
hash_expr* parse::hash() {
|
hash_expr* parse::hash() {
|
||||||
auto node = new hash_expr(toks[ptr].loc);
|
auto node = new hash_expr(toks[ptr].loc);
|
||||||
match(tok::tk_lbrace);
|
match(tok::tk_lbrace);
|
||||||
while(!lookahead(tok::tk_rbrace)) {
|
while (!lookahead(tok::tk_rbrace)) {
|
||||||
node->add_member(pair());
|
node->add_member(pair());
|
||||||
if (lookahead(tok::tk_comma)) {
|
if (lookahead(tok::tk_comma)) {
|
||||||
match(tok::tk_comma);
|
match(tok::tk_comma);
|
||||||
|
@ -342,7 +342,7 @@ function* parse::func() {
|
||||||
|
|
||||||
void parse::params(function* func_node) {
|
void parse::params(function* func_node) {
|
||||||
match(tok::tk_lcurve);
|
match(tok::tk_lcurve);
|
||||||
while(!lookahead(tok::tk_rcurve)) {
|
while (!lookahead(tok::tk_rcurve)) {
|
||||||
auto param = new parameter(toks[ptr].loc);
|
auto param = new parameter(toks[ptr].loc);
|
||||||
param->set_parameter_name(toks[ptr].str);
|
param->set_parameter_name(toks[ptr].str);
|
||||||
match(tok::tk_id);
|
match(tok::tk_id);
|
||||||
|
@ -428,7 +428,7 @@ code_block* parse::expression_block() {
|
||||||
auto node = new code_block(toks[ptr].loc);
|
auto node = new code_block(toks[ptr].loc);
|
||||||
if (lookahead(tok::tk_lbrace)) {
|
if (lookahead(tok::tk_lbrace)) {
|
||||||
match(tok::tk_lbrace);
|
match(tok::tk_lbrace);
|
||||||
while(!lookahead(tok::tk_rbrace) && !lookahead(tok::tk_eof)) {
|
while (!lookahead(tok::tk_rbrace) && !lookahead(tok::tk_eof)) {
|
||||||
node->add_expression(expression());
|
node->add_expression(expression());
|
||||||
if (lookahead(tok::tk_semi)) {
|
if (lookahead(tok::tk_semi)) {
|
||||||
match(tok::tk_semi);
|
match(tok::tk_semi);
|
||||||
|
@ -496,7 +496,7 @@ expr* parse::calc() {
|
||||||
|
|
||||||
expr* parse::bitwise_or() {
|
expr* parse::bitwise_or() {
|
||||||
auto node = bitwise_xor();
|
auto node = bitwise_xor();
|
||||||
while(lookahead(tok::tk_btor)) {
|
while (lookahead(tok::tk_btor)) {
|
||||||
auto tmp = new binary_operator(toks[ptr].loc);
|
auto tmp = new binary_operator(toks[ptr].loc);
|
||||||
tmp->set_operator_type(binary_operator::kind::bitwise_or);
|
tmp->set_operator_type(binary_operator::kind::bitwise_or);
|
||||||
tmp->set_left(node);
|
tmp->set_left(node);
|
||||||
|
@ -511,7 +511,7 @@ expr* parse::bitwise_or() {
|
||||||
|
|
||||||
expr* parse::bitwise_xor() {
|
expr* parse::bitwise_xor() {
|
||||||
auto node = bitwise_and();
|
auto node = bitwise_and();
|
||||||
while(lookahead(tok::tk_btxor)) {
|
while (lookahead(tok::tk_btxor)) {
|
||||||
auto tmp = new binary_operator(toks[ptr].loc);
|
auto tmp = new binary_operator(toks[ptr].loc);
|
||||||
tmp->set_operator_type(binary_operator::kind::bitwise_xor);
|
tmp->set_operator_type(binary_operator::kind::bitwise_xor);
|
||||||
tmp->set_left(node);
|
tmp->set_left(node);
|
||||||
|
@ -526,7 +526,7 @@ expr* parse::bitwise_xor() {
|
||||||
|
|
||||||
expr* parse::bitwise_and() {
|
expr* parse::bitwise_and() {
|
||||||
auto node = or_expr();
|
auto node = or_expr();
|
||||||
while(lookahead(tok::tk_btand)) {
|
while (lookahead(tok::tk_btand)) {
|
||||||
auto tmp = new binary_operator(toks[ptr].loc);
|
auto tmp = new binary_operator(toks[ptr].loc);
|
||||||
tmp->set_operator_type(binary_operator::kind::bitwise_and);
|
tmp->set_operator_type(binary_operator::kind::bitwise_and);
|
||||||
tmp->set_left(node);
|
tmp->set_left(node);
|
||||||
|
@ -541,7 +541,7 @@ expr* parse::bitwise_and() {
|
||||||
|
|
||||||
expr* parse::or_expr() {
|
expr* parse::or_expr() {
|
||||||
auto node = and_expr();
|
auto node = and_expr();
|
||||||
while(lookahead(tok::tk_or)) {
|
while (lookahead(tok::tk_or)) {
|
||||||
auto tmp = new binary_operator(toks[ptr].loc);
|
auto tmp = new binary_operator(toks[ptr].loc);
|
||||||
tmp->set_operator_type(binary_operator::kind::condition_or);
|
tmp->set_operator_type(binary_operator::kind::condition_or);
|
||||||
tmp->set_left(node);
|
tmp->set_left(node);
|
||||||
|
@ -556,7 +556,7 @@ expr* parse::or_expr() {
|
||||||
|
|
||||||
expr* parse::and_expr() {
|
expr* parse::and_expr() {
|
||||||
auto node = cmp_expr();
|
auto node = cmp_expr();
|
||||||
while(lookahead(tok::tk_and)) {
|
while (lookahead(tok::tk_and)) {
|
||||||
auto tmp = new binary_operator(toks[ptr].loc);
|
auto tmp = new binary_operator(toks[ptr].loc);
|
||||||
tmp->set_operator_type(binary_operator::kind::condition_and);
|
tmp->set_operator_type(binary_operator::kind::condition_and);
|
||||||
tmp->set_left(node);
|
tmp->set_left(node);
|
||||||
|
@ -571,7 +571,7 @@ expr* parse::and_expr() {
|
||||||
|
|
||||||
expr* parse::cmp_expr() {
|
expr* parse::cmp_expr() {
|
||||||
auto node = null_chain_expr();
|
auto node = null_chain_expr();
|
||||||
while(tok::tk_cmpeq<=toks[ptr].type && toks[ptr].type<=tok::tk_geq) {
|
while (tok::tk_cmpeq<=toks[ptr].type && toks[ptr].type<=tok::tk_geq) {
|
||||||
auto tmp = new binary_operator(toks[ptr].loc);
|
auto tmp = new binary_operator(toks[ptr].loc);
|
||||||
switch(toks[ptr].type) {
|
switch(toks[ptr].type) {
|
||||||
case tok::tk_cmpeq: tmp->set_operator_type(binary_operator::kind::cmpeq); break;
|
case tok::tk_cmpeq: tmp->set_operator_type(binary_operator::kind::cmpeq); break;
|
||||||
|
@ -594,7 +594,7 @@ expr* parse::cmp_expr() {
|
||||||
|
|
||||||
expr* parse::null_chain_expr() {
|
expr* parse::null_chain_expr() {
|
||||||
auto node = additive_expr();
|
auto node = additive_expr();
|
||||||
while(lookahead(tok::tk_quesques)) {
|
while (lookahead(tok::tk_quesques)) {
|
||||||
auto tmp = new binary_operator(toks[ptr].loc);
|
auto tmp = new binary_operator(toks[ptr].loc);
|
||||||
tmp->set_operator_type(binary_operator::kind::null_chain);
|
tmp->set_operator_type(binary_operator::kind::null_chain);
|
||||||
tmp->set_left(node);
|
tmp->set_left(node);
|
||||||
|
@ -609,7 +609,7 @@ expr* parse::null_chain_expr() {
|
||||||
|
|
||||||
expr* parse::additive_expr() {
|
expr* parse::additive_expr() {
|
||||||
auto node = multive_expr();
|
auto node = multive_expr();
|
||||||
while(lookahead(tok::tk_add) ||
|
while (lookahead(tok::tk_add) ||
|
||||||
lookahead(tok::tk_sub) ||
|
lookahead(tok::tk_sub) ||
|
||||||
lookahead(tok::tk_floater)) {
|
lookahead(tok::tk_floater)) {
|
||||||
auto tmp = new binary_operator(toks[ptr].loc);
|
auto tmp = new binary_operator(toks[ptr].loc);
|
||||||
|
@ -633,7 +633,7 @@ expr* parse::multive_expr() {
|
||||||
expr* node=(lookahead(tok::tk_sub) ||
|
expr* node=(lookahead(tok::tk_sub) ||
|
||||||
lookahead(tok::tk_not) ||
|
lookahead(tok::tk_not) ||
|
||||||
lookahead(tok::tk_floater))? unary():scalar();
|
lookahead(tok::tk_floater))? unary():scalar();
|
||||||
while(lookahead(tok::tk_mult) || lookahead(tok::tk_div)) {
|
while (lookahead(tok::tk_mult) || lookahead(tok::tk_div)) {
|
||||||
auto tmp = new binary_operator(toks[ptr].loc);
|
auto tmp = new binary_operator(toks[ptr].loc);
|
||||||
if (lookahead(tok::tk_mult)) {
|
if (lookahead(tok::tk_mult)) {
|
||||||
tmp->set_operator_type(binary_operator::kind::mult);
|
tmp->set_operator_type(binary_operator::kind::mult);
|
||||||
|
@ -718,14 +718,14 @@ expr* parse::scalar() {
|
||||||
return null();
|
return null();
|
||||||
}
|
}
|
||||||
// check call and avoid ambiguous syntax:
|
// check call and avoid ambiguous syntax:
|
||||||
// var f = func(){}
|
// var f = func() {}
|
||||||
// (var a, b, c) = (1, 2, 3);
|
// (var a, b, c) = (1, 2, 3);
|
||||||
// will be incorrectly recognized like:
|
// will be incorrectly recognized like:
|
||||||
// var f = func(){}(var a, b, c)
|
// var f = func() {}(var a, b, c)
|
||||||
if (is_call(toks[ptr].type) && !check_in_curve_multi_definition()) {
|
if (is_call(toks[ptr].type) && !check_in_curve_multi_definition()) {
|
||||||
auto call_node = new call_expr(toks[ptr].loc);
|
auto call_node = new call_expr(toks[ptr].loc);
|
||||||
call_node->set_first(node);
|
call_node->set_first(node);
|
||||||
while(is_call(toks[ptr].type)) {
|
while (is_call(toks[ptr].type)) {
|
||||||
call_node->add_call(call_scalar());
|
call_node->add_call(call_scalar());
|
||||||
}
|
}
|
||||||
node = call_node;
|
node = call_node;
|
||||||
|
@ -776,7 +776,7 @@ call_vector* parse::callv() {
|
||||||
};
|
};
|
||||||
auto node = new call_vector(toks[ptr].loc);
|
auto node = new call_vector(toks[ptr].loc);
|
||||||
match(tok::tk_lbracket);
|
match(tok::tk_lbracket);
|
||||||
while(!lookahead(tok::tk_rbracket)) {
|
while (!lookahead(tok::tk_rbracket)) {
|
||||||
node->add_slice(subvec());
|
node->add_slice(subvec());
|
||||||
if (lookahead(tok::tk_comma)) {
|
if (lookahead(tok::tk_comma)) {
|
||||||
match(tok::tk_comma);
|
match(tok::tk_comma);
|
||||||
|
@ -807,7 +807,7 @@ call_function* parse::callf() {
|
||||||
auto node = new call_function(toks[ptr].loc);
|
auto node = new call_function(toks[ptr].loc);
|
||||||
bool special_call=check_special_call();
|
bool special_call=check_special_call();
|
||||||
match(tok::tk_lcurve);
|
match(tok::tk_lcurve);
|
||||||
while(!lookahead(tok::tk_rcurve)) {
|
while (!lookahead(tok::tk_rcurve)) {
|
||||||
node->add_argument(special_call?pair():calc());
|
node->add_argument(special_call?pair():calc());
|
||||||
if (lookahead(tok::tk_comma))
|
if (lookahead(tok::tk_comma))
|
||||||
match(tok::tk_comma);
|
match(tok::tk_comma);
|
||||||
|
@ -883,7 +883,7 @@ multi_identifier* parse::outcurve_def() {
|
||||||
|
|
||||||
multi_identifier* parse::multi_id() {
|
multi_identifier* parse::multi_id() {
|
||||||
auto node = new multi_identifier(toks[ptr].loc);
|
auto node = new multi_identifier(toks[ptr].loc);
|
||||||
while(!lookahead(tok::tk_eof)) {
|
while (!lookahead(tok::tk_eof)) {
|
||||||
// only identifier is allowed here
|
// only identifier is allowed here
|
||||||
node->add_var(id());
|
node->add_var(id());
|
||||||
if (lookahead(tok::tk_comma)) {
|
if (lookahead(tok::tk_comma)) {
|
||||||
|
@ -909,7 +909,7 @@ tuple_expr* parse::multi_scalar() {
|
||||||
};
|
};
|
||||||
auto node = new tuple_expr(toks[ptr].loc);
|
auto node = new tuple_expr(toks[ptr].loc);
|
||||||
match(tok::tk_lcurve);
|
match(tok::tk_lcurve);
|
||||||
while(!lookahead(tok::tk_rcurve)) {
|
while (!lookahead(tok::tk_rcurve)) {
|
||||||
node->add_element(calc());
|
node->add_element(calc());
|
||||||
if (lookahead(tok::tk_comma)) {
|
if (lookahead(tok::tk_comma)) {
|
||||||
match(tok::tk_comma);
|
match(tok::tk_comma);
|
||||||
|
@ -1068,7 +1068,7 @@ iter_expr* parse::iter_gen() {
|
||||||
// call expression
|
// call expression
|
||||||
auto tmp = new call_expr(id_node->get_location());
|
auto tmp = new call_expr(id_node->get_location());
|
||||||
tmp->set_first(id_node);
|
tmp->set_first(id_node);
|
||||||
while(is_call(toks[ptr].type)) {
|
while (is_call(toks[ptr].type)) {
|
||||||
tmp->add_call(call_scalar());
|
tmp->add_call(call_scalar());
|
||||||
}
|
}
|
||||||
node->set_call(tmp);
|
node->set_call(tmp);
|
||||||
|
@ -1090,7 +1090,7 @@ condition_expr* parse::cond() {
|
||||||
node->set_if_statement(ifnode);
|
node->set_if_statement(ifnode);
|
||||||
|
|
||||||
// generate elsif
|
// generate elsif
|
||||||
while(lookahead(tok::tk_elsif)) {
|
while (lookahead(tok::tk_elsif)) {
|
||||||
auto elsifnode = new if_expr(toks[ptr].loc);
|
auto elsifnode = new if_expr(toks[ptr].loc);
|
||||||
match(tok::tk_elsif);
|
match(tok::tk_elsif);
|
||||||
match(tok::tk_lcurve);
|
match(tok::tk_lcurve);
|
||||||
|
|
|
@ -709,7 +709,7 @@ void vm::run(const codegen& gen,
|
||||||
code.push_back(operand_function[i.op]);
|
code.push_back(operand_function[i.op]);
|
||||||
imm.push_back(i.num);
|
imm.push_back(i.num);
|
||||||
}
|
}
|
||||||
while(code[ctx.pc]) {
|
while (code[ctx.pc]) {
|
||||||
if (interrupt_ptr && interrupt_ptr->load()) {
|
if (interrupt_ptr && interrupt_ptr->load()) {
|
||||||
throw std::runtime_error("VM execution interrupted by timeout");
|
throw std::runtime_error("VM execution interrupted by timeout");
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,7 +121,7 @@ var builtin_split(context* ctx, gc* ngc) {
|
||||||
|
|
||||||
usize last = 0;
|
usize last = 0;
|
||||||
usize pos = s.find(sep, 0);
|
usize pos = s.find(sep, 0);
|
||||||
while(pos!=std::string::npos) {
|
while (pos!=std::string::npos) {
|
||||||
if (pos>last) {
|
if (pos>last) {
|
||||||
vec.push_back(ngc->newstr(s.substr(last, pos-last)));
|
vec.push_back(ngc->newstr(s.substr(last, pos-last)));
|
||||||
}
|
}
|
||||||
|
@ -169,7 +169,7 @@ var builtin_split_with_empty_substr(context* ctx, gc* ngc) {
|
||||||
|
|
||||||
usize last = 0;
|
usize last = 0;
|
||||||
usize pos = s.find(sep, 0);
|
usize pos = s.find(sep, 0);
|
||||||
while(pos!=std::string::npos) {
|
while (pos!=std::string::npos) {
|
||||||
if (pos>=last) {
|
if (pos>=last) {
|
||||||
vec.push_back(ngc->newstr(s.substr(last, pos-last)));
|
vec.push_back(ngc->newstr(s.substr(last, pos-last)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ std::vector<std::string> possible_dylib_path() {
|
||||||
std::vector<std::string> env_path_vec = {"."};
|
std::vector<std::string> env_path_vec = {"."};
|
||||||
usize last = 0;
|
usize last = 0;
|
||||||
usize pos = env_path.find(sep, 0);
|
usize pos = env_path.find(sep, 0);
|
||||||
while(pos != std::string::npos) {
|
while (pos != std::string::npos) {
|
||||||
if (pos > last) {
|
if (pos > last) {
|
||||||
env_path_vec.push_back(env_path.substr(last, pos - last));
|
env_path_vec.push_back(env_path.substr(last, pos - last));
|
||||||
}
|
}
|
||||||
|
|
|
@ -158,7 +158,7 @@ var builtin_readln(context* ctx, gc* ngc) {
|
||||||
}
|
}
|
||||||
auto result = ngc->alloc(vm_type::vm_str);
|
auto result = ngc->alloc(vm_type::vm_str);
|
||||||
char c;
|
char c;
|
||||||
while((c = fgetc(file_descriptor.ghost().get<FILE>()))!=EOF) {
|
while ((c = fgetc(file_descriptor.ghost().get<FILE>()))!=EOF) {
|
||||||
if (c=='\r') {
|
if (c=='\r') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,7 +165,7 @@ std::string json::stringify(var& object) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void json::next() {
|
void json::next() {
|
||||||
while(ptr<text.length() && !check(text[ptr])) {
|
while (ptr<text.length() && !check(text[ptr])) {
|
||||||
if (text[ptr]=='\n') {
|
if (text[ptr]=='\n') {
|
||||||
++line;
|
++line;
|
||||||
} else if (text[ptr]!=' ' && text[ptr]!='\t' && text[ptr]!='\r') {
|
} else if (text[ptr]!=' ' && text[ptr]!='\t' && text[ptr]!='\r') {
|
||||||
|
@ -193,7 +193,7 @@ void json::next() {
|
||||||
if (is_num(c) || c=='-' || c=='+') {
|
if (is_num(c) || c=='-' || c=='+') {
|
||||||
auto temp = std::string(1, c);
|
auto temp = std::string(1, c);
|
||||||
++ptr;
|
++ptr;
|
||||||
while(ptr<text.length() && (
|
while (ptr<text.length() && (
|
||||||
is_num(text[ptr]) ||
|
is_num(text[ptr]) ||
|
||||||
text[ptr]=='.' ||
|
text[ptr]=='.' ||
|
||||||
text[ptr]=='e' ||
|
text[ptr]=='e' ||
|
||||||
|
@ -207,7 +207,7 @@ void json::next() {
|
||||||
} else if (is_id(c)) {
|
} else if (is_id(c)) {
|
||||||
auto temp = std::string(1, c);
|
auto temp = std::string(1, c);
|
||||||
++ptr;
|
++ptr;
|
||||||
while(ptr<text.length() && (is_id(text[ptr]) || is_num(text[ptr]))) {
|
while (ptr<text.length() && (is_id(text[ptr]) || is_num(text[ptr]))) {
|
||||||
temp += text[ptr];
|
temp += text[ptr];
|
||||||
++ptr;
|
++ptr;
|
||||||
}
|
}
|
||||||
|
@ -221,7 +221,7 @@ void json::next() {
|
||||||
auto begin = c;
|
auto begin = c;
|
||||||
auto temp = std::string("");
|
auto temp = std::string("");
|
||||||
++ptr;
|
++ptr;
|
||||||
while(ptr<text.length() && text[ptr]!=begin) {
|
while (ptr<text.length() && text[ptr]!=begin) {
|
||||||
temp += text[ptr];
|
temp += text[ptr];
|
||||||
++ptr;
|
++ptr;
|
||||||
if (text[ptr-1]=='\\' && ptr<text.length()) {
|
if (text[ptr-1]=='\\' && ptr<text.length()) {
|
||||||
|
@ -264,7 +264,7 @@ var json::vector_object_generate(gc* ngc) {
|
||||||
temp_stack.vec().elems.push_back(vect_object);
|
temp_stack.vec().elems.push_back(vect_object);
|
||||||
match(json_token_type::tok_lbrkt);
|
match(json_token_type::tok_lbrkt);
|
||||||
vector_member(vect_object.vec(), ngc);
|
vector_member(vect_object.vec(), ngc);
|
||||||
while(this_token.type==json_token_type::tok_comma) {
|
while (this_token.type==json_token_type::tok_comma) {
|
||||||
match(json_token_type::tok_comma);
|
match(json_token_type::tok_comma);
|
||||||
vector_member(vect_object.vec(), ngc);
|
vector_member(vect_object.vec(), ngc);
|
||||||
}
|
}
|
||||||
|
@ -303,7 +303,7 @@ var json::hash_object_generate(gc* ngc) {
|
||||||
temp_stack.vec().elems.push_back(hash_object);
|
temp_stack.vec().elems.push_back(hash_object);
|
||||||
match(json_token_type::tok_lbrace);
|
match(json_token_type::tok_lbrace);
|
||||||
hash_member(hash_object.hash(), ngc);
|
hash_member(hash_object.hash(), ngc);
|
||||||
while(this_token.type==json_token_type::tok_comma) {
|
while (this_token.type==json_token_type::tok_comma) {
|
||||||
match(json_token_type::tok_comma);
|
match(json_token_type::tok_comma);
|
||||||
hash_member(hash_object.hash(), ngc);
|
hash_member(hash_object.hash(), ngc);
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ void repl::update_temp_file(const std::vector<std::string>& src) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool repl::check_need_more_input() {
|
bool repl::check_need_more_input() {
|
||||||
while(true) {
|
while (true) {
|
||||||
update_temp_file();
|
update_temp_file();
|
||||||
auto nasal_lexer = std::make_unique<lexer>();
|
auto nasal_lexer = std::make_unique<lexer>();
|
||||||
if (nasal_lexer->scan("<nasal-repl>").geterr()) {
|
if (nasal_lexer->scan("<nasal-repl>").geterr()) {
|
||||||
|
@ -160,7 +160,7 @@ void repl::execute() {
|
||||||
std::cout << " (" << __DATE__ << " " << __TIME__ << ")\n";
|
std::cout << " (" << __DATE__ << " " << __TIME__ << ")\n";
|
||||||
help();
|
help();
|
||||||
|
|
||||||
while(true) {
|
while (true) {
|
||||||
auto line = readline();
|
auto line = readline();
|
||||||
if (!line.length()) {
|
if (!line.length()) {
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -188,7 +188,7 @@ f64 hex_to_f64(const char* str) {
|
||||||
|
|
||||||
f64 oct_to_f64(const char* str) {
|
f64 oct_to_f64(const char* str) {
|
||||||
f64 ret = 0;
|
f64 ret = 0;
|
||||||
while('0'<=*str && *str<'8') {
|
while ('0'<=*str && *str<'8') {
|
||||||
ret = ret*8+(*str++-'0');
|
ret = ret*8+(*str++-'0');
|
||||||
}
|
}
|
||||||
if (*str) {
|
if (*str) {
|
||||||
|
@ -206,7 +206,7 @@ f64 oct_to_f64(const char* str) {
|
||||||
f64 dec_to_f64(const char* str) {
|
f64 dec_to_f64(const char* str) {
|
||||||
f64 ret = 0, num_pow = 0;
|
f64 ret = 0, num_pow = 0;
|
||||||
bool negative = false;
|
bool negative = false;
|
||||||
while('0'<=*str && *str<='9') {
|
while ('0'<=*str && *str<='9') {
|
||||||
ret = ret*10+(*str++-'0');
|
ret = ret*10+(*str++-'0');
|
||||||
}
|
}
|
||||||
if (!*str) {
|
if (!*str) {
|
||||||
|
@ -217,7 +217,7 @@ f64 dec_to_f64(const char* str) {
|
||||||
return nan("");
|
return nan("");
|
||||||
}
|
}
|
||||||
num_pow = 0.1;
|
num_pow = 0.1;
|
||||||
while('0'<=*str && *str<='9') {
|
while ('0'<=*str && *str<='9') {
|
||||||
ret += num_pow*(*str++-'0');
|
ret += num_pow*(*str++-'0');
|
||||||
num_pow *= 0.1;
|
num_pow *= 0.1;
|
||||||
}
|
}
|
||||||
|
@ -238,7 +238,7 @@ f64 dec_to_f64(const char* str) {
|
||||||
return nan("");
|
return nan("");
|
||||||
}
|
}
|
||||||
num_pow = 0;
|
num_pow = 0;
|
||||||
while('0'<=*str && *str<='9') {
|
while ('0'<=*str && *str<='9') {
|
||||||
num_pow = num_pow*10+(*str++-'0');
|
num_pow = num_pow*10+(*str++-'0');
|
||||||
}
|
}
|
||||||
if (*str) {
|
if (*str) {
|
||||||
|
|
|
@ -63,7 +63,7 @@ var add_event = func(name,interval,function) {
|
||||||
fg_globals.event[name]=coroutine.create(func {
|
fg_globals.event[name]=coroutine.create(func {
|
||||||
var timestamp=maketimestamp();
|
var timestamp=maketimestamp();
|
||||||
timestamp.stamp();
|
timestamp.stamp();
|
||||||
while(timestamp.elapsedMSec()<interval*1000)
|
while (timestamp.elapsedMSec()<interval*1000)
|
||||||
coroutine.yield();
|
coroutine.yield();
|
||||||
println("[\e[32m",name,"\e[0m] [",os.time(),"] type:\e[33mevent\e[0m interval:\e[34m",interval,"\e[0m");
|
println("[\e[32m",name,"\e[0m] [",os.time(),"] type:\e[33mevent\e[0m interval:\e[34m",interval,"\e[0m");
|
||||||
function();
|
function();
|
||||||
|
@ -75,10 +75,10 @@ var add_task = func(name,interval,function) {
|
||||||
fg_globals.task[name]=coroutine.create(func {
|
fg_globals.task[name]=coroutine.create(func {
|
||||||
var counter=0;
|
var counter=0;
|
||||||
var timestamp=maketimestamp();
|
var timestamp=maketimestamp();
|
||||||
while(1) {
|
while (1) {
|
||||||
counter+=1;
|
counter+=1;
|
||||||
timestamp.stamp();
|
timestamp.stamp();
|
||||||
while(timestamp.elapsedMSec()<interval*1000)
|
while (timestamp.elapsedMSec()<interval*1000)
|
||||||
coroutine.yield();
|
coroutine.yield();
|
||||||
println("[\e[32m",name,"\e[0m] [",os.time(),"] type:\e[34mtask\e[0m interval:\e[34m",interval,"\e[0m invoke-time:\e[96m",counter,"\e[0m");
|
println("[\e[32m",name,"\e[0m] [",os.time(),"] type:\e[34mtask\e[0m interval:\e[34m",interval,"\e[0m invoke-time:\e[96m",counter,"\e[0m");
|
||||||
function();
|
function();
|
||||||
|
@ -145,7 +145,7 @@ var settimer = func() {
|
||||||
println("[\e[32m maketimer \e[0m] [",os.time(),"] test func simulation()");
|
println("[\e[32m maketimer \e[0m] [",os.time(),"] test func simulation()");
|
||||||
var simulation = func() {
|
var simulation = func() {
|
||||||
var running=1;
|
var running=1;
|
||||||
while(running) {
|
while (running) {
|
||||||
running=0;
|
running=0;
|
||||||
foreach(var i;keys(fg_globals.task)) {
|
foreach(var i;keys(fg_globals.task)) {
|
||||||
if (!contains(fg_globals.task,i))
|
if (!contains(fg_globals.task,i))
|
||||||
|
@ -542,7 +542,7 @@ func() {
|
||||||
srand();
|
srand();
|
||||||
var tmp=nil;
|
var tmp=nil;
|
||||||
var vec=[props.globals];
|
var vec=[props.globals];
|
||||||
while(size(vec)) {
|
while (size(vec)) {
|
||||||
tmp=[];
|
tmp=[];
|
||||||
foreach(var i;vec) {
|
foreach(var i;vec) {
|
||||||
if (typeof(i.val)=="hash") {
|
if (typeof(i.val)=="hash") {
|
||||||
|
|
|
@ -53,7 +53,7 @@ var find_all_files = func(path) {
|
||||||
}
|
}
|
||||||
var dd = unix.opendir(path);
|
var dd = unix.opendir(path);
|
||||||
var res = [];
|
var res = [];
|
||||||
while(var n = unix.readdir(dd)) {
|
while (var n = unix.readdir(dd)) {
|
||||||
if (unix.isfile(path ~ "/" ~ n)) {
|
if (unix.isfile(path ~ "/" ~ n)) {
|
||||||
append(res, n);
|
append(res, n);
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ var recursive_find_files = func(path) {
|
||||||
dir: path,
|
dir: path,
|
||||||
files: []
|
files: []
|
||||||
};
|
};
|
||||||
while(var n = unix.readdir(dd)) {
|
while (var n = unix.readdir(dd)) {
|
||||||
if (unix.isfile(path ~ "/" ~ n)) {
|
if (unix.isfile(path ~ "/" ~ n)) {
|
||||||
append(res.files, n);
|
append(res.files, n);
|
||||||
} elsif (unix.isdir(path ~ "/" ~ n) and n != "." and n != "..") {
|
} elsif (unix.isdir(path ~ "/" ~ n) and n != "." and n != "..") {
|
||||||
|
@ -92,7 +92,7 @@ var recursive_find_files_flat = func(path) {
|
||||||
}
|
}
|
||||||
var flat = [];
|
var flat = [];
|
||||||
var bfs = [tree_files];
|
var bfs = [tree_files];
|
||||||
while(size(bfs) != 0) {
|
while (size(bfs) != 0) {
|
||||||
var first = pop(bfs);
|
var first = pop(bfs);
|
||||||
foreach(var file_record; first.files) {
|
foreach(var file_record; first.files) {
|
||||||
if (ishash(file_record)) {
|
if (ishash(file_record)) {
|
||||||
|
|
|
@ -231,12 +231,12 @@ var sort = func() {
|
||||||
var base = left+int(rand()*(right-left));
|
var base = left+int(rand()*(right-left));
|
||||||
(vec[left], vec[base]) = (vec[base], vec[left]);
|
(vec[left], vec[base]) = (vec[base], vec[left]);
|
||||||
var (i, j, tmp) = (left, right, vec[left]);
|
var (i, j, tmp) = (left, right, vec[left]);
|
||||||
while(i<j) {
|
while (i<j) {
|
||||||
while(i<j and cmp(tmp,vec[j])) {
|
while (i<j and cmp(tmp,vec[j])) {
|
||||||
j -= 1;
|
j -= 1;
|
||||||
}
|
}
|
||||||
vec[i] = vec[j];
|
vec[i] = vec[j];
|
||||||
while(i<j and cmp(vec[i],tmp)) {
|
while (i<j and cmp(vec[i],tmp)) {
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
vec[j] = vec[i];
|
vec[j] = vec[i];
|
||||||
|
|
|
@ -220,7 +220,7 @@ var bp_example = func() {
|
||||||
|
|
||||||
var epoch=0;
|
var epoch=0;
|
||||||
var total=1e6;
|
var total=1e6;
|
||||||
while(total>0.001) {
|
while (total>0.001) {
|
||||||
epoch+=1;
|
epoch+=1;
|
||||||
if (epoch>1e4) {
|
if (epoch>1e4) {
|
||||||
println("Training failed after ",epoch," epoch.");
|
println("Training failed after ",epoch," epoch.");
|
||||||
|
|
|
@ -37,7 +37,7 @@ var _connect = func(hostname, port) {
|
||||||
socket.IPPROTO_TCP
|
socket.IPPROTO_TCP
|
||||||
);
|
);
|
||||||
var ip_info = hostname~":"~port;
|
var ip_info = hostname~":"~port;
|
||||||
while((var err = socket.connect(sd, hostname, port))==socket.SOCKET_ERROR) {
|
while ((var err = socket.connect(sd, hostname, port))==socket.SOCKET_ERROR) {
|
||||||
println(_get_time(), " failed to connect ", ip_info, ": ", socket.errno());
|
println(_get_time(), " failed to connect ", ip_info, ": ", socket.errno());
|
||||||
unix.sleep(1);
|
unix.sleep(1);
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ var new = func(hostname, port) {
|
||||||
# get total message
|
# get total message
|
||||||
var total_source = message.str;
|
var total_source = message.str;
|
||||||
# 0\r\n\r\n is the tail of chunked http info
|
# 0\r\n\r\n is the tail of chunked http info
|
||||||
while(find("0\r\n\r\n", total_source)<0) {
|
while (find("0\r\n\r\n", total_source)<0) {
|
||||||
message = socket.recv(sd, 1024);
|
message = socket.recv(sd, 1024);
|
||||||
total_source ~= message.str;
|
total_source ~= message.str;
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,11 +112,11 @@ var spinner = func() {
|
||||||
for (var i=0;i<len;i+=1) {
|
for (var i=0;i<len;i+=1) {
|
||||||
tmp=pop(vec)~tmp;
|
tmp=pop(vec)~tmp;
|
||||||
append(res,tmp);
|
append(res,tmp);
|
||||||
while(size(res[-1])!=16)
|
while (size(res[-1])!=16)
|
||||||
res[-1]~=" ";
|
res[-1]~=" ";
|
||||||
}
|
}
|
||||||
tmp=res[-1];
|
tmp=res[-1];
|
||||||
while(tmp!=" ") {
|
while (tmp!=" ") {
|
||||||
tmp=" "~substr(tmp,0,15);
|
tmp=" "~substr(tmp,0,15);
|
||||||
append(res,tmp);
|
append(res,tmp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ use std.unix;
|
||||||
var udp_server = func(hostname, port, retry_delay = 5) {
|
var udp_server = func(hostname, port, retry_delay = 5) {
|
||||||
var socket = libnasock.socket;
|
var socket = libnasock.socket;
|
||||||
var server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
|
var server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
|
||||||
while(socket.bind(server, hostname, port) < 0) {
|
while (socket.bind(server, hostname, port) < 0) {
|
||||||
println("[", os.time(), "] failed to bind socket "~server~" at ", hostname, ":", port, ".");
|
println("[", os.time(), "] failed to bind socket "~server~" at ", hostname, ":", port, ".");
|
||||||
unix.sleep(retry_delay);
|
unix.sleep(retry_delay);
|
||||||
println("[", os.time(), "] retrying...");
|
println("[", os.time(), "] retrying...");
|
||||||
|
@ -29,7 +29,7 @@ var udp_client = func(hostname = "", port = -1, retry_delay = 5) {
|
||||||
var socket = libnasock.socket;
|
var socket = libnasock.socket;
|
||||||
var client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
|
var client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
|
||||||
if (port > 0 and size(hostname) != 0) {
|
if (port > 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, ".");
|
println("[",os.time(),"] failed to bind socket "~client~" at ", hostname, ":", port, ".");
|
||||||
unix.sleep(retry_delay);
|
unix.sleep(retry_delay);
|
||||||
println("[",os.time(),"] retrying...");
|
println("[",os.time(),"] retrying...");
|
||||||
|
|
|
@ -209,7 +209,7 @@ var bf = func(program) {
|
||||||
f~="print(chr(paper[ptr]));\n";
|
f~="print(chr(paper[ptr]));\n";
|
||||||
} elsif (c=='[') {
|
} elsif (c=='[') {
|
||||||
f~=padding(size(stack));
|
f~=padding(size(stack));
|
||||||
f~="while(paper[ptr]) {\n";
|
f~="while (paper[ptr]) {\n";
|
||||||
append(stack,0);
|
append(stack,0);
|
||||||
} elsif (c==']') {
|
} elsif (c==']') {
|
||||||
if (!size(stack)) {
|
if (!size(stack)) {
|
||||||
|
|
|
@ -32,7 +32,7 @@ var bfs = func(begin,end) {
|
||||||
map[end[0]][end[1]]=0;
|
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;
|
map[1][0]=0;
|
||||||
while(!que.empty()) {
|
while (!que.empty()) {
|
||||||
var vertex=que.front();
|
var vertex=que.front();
|
||||||
que.pop();
|
que.pop();
|
||||||
foreach(var i;move) {
|
foreach(var i;move) {
|
||||||
|
|
|
@ -107,7 +107,7 @@ var backward = func(x) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var (cnt,error)=(0,100);
|
var (cnt,error)=(0,100);
|
||||||
while(error>0.0005) {
|
while (error>0.0005) {
|
||||||
error=0;
|
error=0;
|
||||||
for (var i=0;i<4;i+=1) {
|
for (var i=0;i<4;i+=1) {
|
||||||
forward(i);
|
forward(i);
|
||||||
|
|
|
@ -15,7 +15,7 @@ var fib = func() {
|
||||||
var (a, b) = (1, 1);
|
var (a, b) = (1, 1);
|
||||||
coroutine.yield(a);
|
coroutine.yield(a);
|
||||||
coroutine.yield(b);
|
coroutine.yield(b);
|
||||||
while(1) {
|
while (1) {
|
||||||
(a, b) = (b, a + b);
|
(a, b) = (b, a + b);
|
||||||
coroutine.yield(b);
|
coroutine.yield(b);
|
||||||
}
|
}
|
||||||
|
@ -95,7 +95,7 @@ println("[2] ok\n");
|
||||||
# pressure test
|
# pressure test
|
||||||
for (var t = 0; t < 10; t += 1) {
|
for (var t = 0; t < 10; t += 1) {
|
||||||
var productor = func() {
|
var productor = func() {
|
||||||
while(1) {
|
while (1) {
|
||||||
coroutine.yield(i);
|
coroutine.yield(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ var select = func(n) {
|
||||||
var left=0;
|
var left=0;
|
||||||
var right=size(message)-1;
|
var right=size(message)-1;
|
||||||
var data=c[2];
|
var data=c[2];
|
||||||
while(left<=right) {
|
while (left<=right) {
|
||||||
var mid=int((left+right)/2);
|
var mid=int((left+right)/2);
|
||||||
var res=message[mid][0];
|
var res=message[mid][0];
|
||||||
if (data==res) {
|
if (data==res) {
|
||||||
|
|
|
@ -42,7 +42,7 @@ var myers = func(src,dst,show_table=0) {
|
||||||
|
|
||||||
var (total,path,vec)=([],[],[[0,0,-1]]);
|
var (total,path,vec)=([],[],[[0,0,-1]]);
|
||||||
visited[0]=1;
|
visited[0]=1;
|
||||||
while(size(vec)) {
|
while (size(vec)) {
|
||||||
append(total,vec);
|
append(total,vec);
|
||||||
var tmp=[];
|
var tmp=[];
|
||||||
forindex(var i;vec) {
|
forindex(var i;vec) {
|
||||||
|
|
|
@ -7,7 +7,7 @@ var files = func(path) {
|
||||||
return [];
|
return [];
|
||||||
var dd=unix.opendir(path);
|
var dd=unix.opendir(path);
|
||||||
var res=[];
|
var res=[];
|
||||||
while(var n=unix.readdir(dd))
|
while (var n=unix.readdir(dd))
|
||||||
append(res,n);
|
append(res,n);
|
||||||
unix.closedir(dd);
|
unix.closedir(dd);
|
||||||
return res;
|
return res;
|
||||||
|
|
|
@ -10,7 +10,7 @@ var chars = "abcdefghijklmnopqrstuvwxyz" ~
|
||||||
chars = split("", chars);
|
chars = split("", chars);
|
||||||
|
|
||||||
print("\ec");
|
print("\ec");
|
||||||
while(1) {
|
while (1) {
|
||||||
var key = libkey.nonblock();
|
var key = libkey.nonblock();
|
||||||
if (key!=nil and chr(key)=="q") {
|
if (key!=nil and chr(key)=="q") {
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use std.unix;
|
use std.unix;
|
||||||
|
|
||||||
var count = 0;
|
var count = 0;
|
||||||
while(1) {
|
while (1) {
|
||||||
unix.sleep(0.1);
|
unix.sleep(0.1);
|
||||||
count += 0.1;
|
count += 0.1;
|
||||||
println("process running time: ", count);
|
println("process running time: ", count);
|
||||||
|
|
|
@ -10,7 +10,7 @@ var http = func() {
|
||||||
return {
|
return {
|
||||||
establish:func(ip,port) {
|
establish:func(ip,port) {
|
||||||
sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP);
|
sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP);
|
||||||
while(socket.bind(sd,ip,port)<0) {
|
while (socket.bind(sd,ip,port)<0) {
|
||||||
println("[",os.time(),"] failed to bind socket "~sd~" at IP: "~ip~" port: "~port~".");
|
println("[",os.time(),"] failed to bind socket "~sd~" at IP: "~ip~" port: "~port~".");
|
||||||
unix.sleep(5);
|
unix.sleep(5);
|
||||||
println("[",os.time(),"] retrying...");
|
println("[",os.time(),"] retrying...");
|
||||||
|
@ -98,7 +98,7 @@ var html_read_file = func(filename) {
|
||||||
s=char(file_text[index]);
|
s=char(file_text[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
while(1) {
|
while (1) {
|
||||||
if (next()>=len)
|
if (next()>=len)
|
||||||
break;
|
break;
|
||||||
if (s==">")
|
if (s==">")
|
||||||
|
@ -111,7 +111,7 @@ var html_read_file = func(filename) {
|
||||||
content~="<code class=\"opr\">"~s~"</code>";
|
content~="<code class=\"opr\">"~s~"</code>";
|
||||||
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
|
var tmp=""~s; # generate a new string
|
||||||
while(1) {
|
while (1) {
|
||||||
if (next()>=len)
|
if (next()>=len)
|
||||||
break;
|
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)
|
||||||
|
@ -138,7 +138,7 @@ var html_read_file = func(filename) {
|
||||||
}
|
}
|
||||||
if (s=="o") {
|
if (s=="o") {
|
||||||
content~="o";
|
content~="o";
|
||||||
while(1) {
|
while (1) {
|
||||||
if (next()>=len)
|
if (next()>=len)
|
||||||
break;
|
break;
|
||||||
if ("0"[0]<=s[0] and s[0]<="7"[0])
|
if ("0"[0]<=s[0] and s[0]<="7"[0])
|
||||||
|
@ -150,7 +150,7 @@ var html_read_file = func(filename) {
|
||||||
prev();
|
prev();
|
||||||
} elsif (s=="x") {
|
} elsif (s=="x") {
|
||||||
content~="x";
|
content~="x";
|
||||||
while(1) {
|
while (1) {
|
||||||
if (next()>=len)
|
if (next()>=len)
|
||||||
break;
|
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"))
|
||||||
|
@ -161,7 +161,7 @@ var html_read_file = func(filename) {
|
||||||
content~="</code>";
|
content~="</code>";
|
||||||
prev();
|
prev();
|
||||||
} elsif (("0"[0]<=s[0] and s[0]<="9"[0]) or s=="." or s=="e") {
|
} 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]) {
|
while ("0"[0]<=s[0] and s[0]<="9"[0]) {
|
||||||
content~=s;
|
content~=s;
|
||||||
if (next()>=len)
|
if (next()>=len)
|
||||||
break;
|
break;
|
||||||
|
@ -171,7 +171,7 @@ var html_read_file = func(filename) {
|
||||||
if (next()>=len)
|
if (next()>=len)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
while("0"[0]<=s[0] and s[0]<="9"[0]) {
|
while ("0"[0]<=s[0] and s[0]<="9"[0]) {
|
||||||
content~=s;
|
content~=s;
|
||||||
if (next()>=len)
|
if (next()>=len)
|
||||||
break;
|
break;
|
||||||
|
@ -186,7 +186,7 @@ var html_read_file = func(filename) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while("0"[0]<=s[0] and s[0]<="9"[0]) {
|
while ("0"[0]<=s[0] and s[0]<="9"[0]) {
|
||||||
content~=s;
|
content~=s;
|
||||||
if (next()>=len)
|
if (next()>=len)
|
||||||
break;
|
break;
|
||||||
|
@ -200,7 +200,7 @@ var html_read_file = func(filename) {
|
||||||
} elsif (s=="\"" or s=="'" or s=="`") {
|
} elsif (s=="\"" or s=="'" or s=="`") {
|
||||||
var quot=s~""; # generate a new string
|
var quot=s~""; # generate a new string
|
||||||
content~="<code class=\"str\">"~s;
|
content~="<code class=\"str\">"~s;
|
||||||
while(1) {
|
while (1) {
|
||||||
if (next()>=len)
|
if (next()>=len)
|
||||||
break;
|
break;
|
||||||
if (s==quot) {
|
if (s==quot) {
|
||||||
|
@ -221,7 +221,7 @@ var html_read_file = func(filename) {
|
||||||
}
|
}
|
||||||
} elsif (s=="#") {
|
} elsif (s=="#") {
|
||||||
content~="<code class=\"note\">"~s;
|
content~="<code class=\"note\">"~s;
|
||||||
while(1) {
|
while (1) {
|
||||||
if (next()>=len)
|
if (next()>=len)
|
||||||
break;
|
break;
|
||||||
if (s=="\n" or s=="\r") {
|
if (s=="\n" or s=="\r") {
|
||||||
|
@ -282,12 +282,12 @@ var respond={
|
||||||
var files = func() {
|
var files = func() {
|
||||||
var res={};
|
var res={};
|
||||||
var dd=unix.opendir("./test");
|
var dd=unix.opendir("./test");
|
||||||
while((var name=unix.readdir(dd))!=nil)
|
while ((var name=unix.readdir(dd))!=nil)
|
||||||
res[name]=1;
|
res[name]=1;
|
||||||
return res;
|
return res;
|
||||||
}();
|
}();
|
||||||
|
|
||||||
while(1) {
|
while (1) {
|
||||||
var client=http.accept();
|
var client=http.accept();
|
||||||
var data=http.recv(client);
|
var data=http.recv(client);
|
||||||
if (data==nil) {
|
if (data==nil) {
|
||||||
|
|
|
@ -25,7 +25,7 @@ var jsonRPC = func() {
|
||||||
},
|
},
|
||||||
connect:func(ip,port) {
|
connect:func(ip,port) {
|
||||||
sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP);
|
sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP);
|
||||||
while(socket.connect(sd,ip,port)<0) {
|
while (socket.connect(sd,ip,port)<0) {
|
||||||
println("[",gettime(),"] failed to connect socket ",sd," to ",ip,":",port);
|
println("[",gettime(),"] failed to connect socket ",sd," to ",ip,":",port);
|
||||||
unix.sleep(5);
|
unix.sleep(5);
|
||||||
}
|
}
|
||||||
|
@ -75,9 +75,9 @@ var server = func(ip,port) {
|
||||||
};
|
};
|
||||||
|
|
||||||
jsonRPC.establish(ip,port);
|
jsonRPC.establish(ip,port);
|
||||||
while(1) {
|
while (1) {
|
||||||
var client=jsonRPC.accept();
|
var client=jsonRPC.accept();
|
||||||
while(1) {
|
while (1) {
|
||||||
var data=jsonRPC.recv(client);
|
var data=jsonRPC.recv(client);
|
||||||
if (data!=nil) {
|
if (data!=nil) {
|
||||||
data=json.parse(data);
|
data=json.parse(data);
|
||||||
|
@ -112,7 +112,7 @@ var client = func(ip,port) {
|
||||||
var params=[["a","b"],["1","2"]];
|
var params=[["a","b"],["1","2"]];
|
||||||
|
|
||||||
var server=jsonRPC.connect(ip,port);
|
var server=jsonRPC.connect(ip,port);
|
||||||
while(1) {
|
while (1) {
|
||||||
unix.sleep(5);
|
unix.sleep(5);
|
||||||
var data=json.stringify({jsonrpc:2.0, id:call_id, method:methods[rand()*size(methods)],params:params[rand()*size(params)]});
|
var data=json.stringify({jsonrpc:2.0, id:call_id, method:methods[rand()*size(methods)],params:params[rand()*size(params)]});
|
||||||
jsonRPC.send(server, data);
|
jsonRPC.send(server, data);
|
||||||
|
|
|
@ -91,7 +91,7 @@ var move = func {
|
||||||
map = temp_map;
|
map = temp_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
while(1) {
|
while (1) {
|
||||||
print_map();
|
print_map();
|
||||||
move();
|
move();
|
||||||
unix.sleep(1/24);
|
unix.sleep(1/24);
|
||||||
|
|
|
@ -3,7 +3,7 @@ var n=4;
|
||||||
var input=[[0,1],[0,2],[1,2]];
|
var input=[[0,1],[0,2],[1,2]];
|
||||||
|
|
||||||
var find_root = func(x,parent) {
|
var find_root = func(x,parent) {
|
||||||
while(parent[x]!=nil)
|
while (parent[x]!=nil)
|
||||||
x=parent[x];
|
x=parent[x];
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ var lexer = func(file) {
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
jmp_note:func() {
|
jmp_note:func() {
|
||||||
while(ptr<len and s[ptr]!='\n'[0])
|
while (ptr<len and s[ptr]!='\n'[0])
|
||||||
ptr+=1;
|
ptr+=1;
|
||||||
if (ptr<len and s[ptr]=='\n'[0])
|
if (ptr<len and s[ptr]=='\n'[0])
|
||||||
line+=1;
|
line+=1;
|
||||||
|
@ -21,7 +21,7 @@ var lexer = func(file) {
|
||||||
},
|
},
|
||||||
id_gen:func() {
|
id_gen:func() {
|
||||||
var tmp="";
|
var tmp="";
|
||||||
while(ptr<len) {
|
while (ptr<len) {
|
||||||
var c=s[ptr];
|
var c=s[ptr];
|
||||||
if (('a'[0]<=c and c<='z'[0])
|
if (('a'[0]<=c and c<='z'[0])
|
||||||
or ('A'[0]<=c and c<='Z'[0])
|
or ('A'[0]<=c and c<='Z'[0])
|
||||||
|
@ -38,7 +38,7 @@ var lexer = func(file) {
|
||||||
var str="";
|
var str="";
|
||||||
var mark=chr(s[ptr]);
|
var mark=chr(s[ptr]);
|
||||||
ptr+=1;
|
ptr+=1;
|
||||||
while(ptr<len and chr(s[ptr])!=mark) {
|
while (ptr<len and chr(s[ptr])!=mark) {
|
||||||
if (chr(s[ptr])=='\\') {
|
if (chr(s[ptr])=='\\') {
|
||||||
ptr+=1;
|
ptr+=1;
|
||||||
var c=chr(s[ptr]);
|
var c=chr(s[ptr]);
|
||||||
|
@ -73,7 +73,7 @@ var lexer = func(file) {
|
||||||
ptr+=1;
|
ptr+=1;
|
||||||
if (ptr<len and chr(s[ptr])=='x') {
|
if (ptr<len and chr(s[ptr])=='x') {
|
||||||
ptr+=1;
|
ptr+=1;
|
||||||
while(ptr<len and
|
while (ptr<len and
|
||||||
('a'[0]<=s[ptr] and s[ptr]<='f'[0]
|
('a'[0]<=s[ptr] and s[ptr]<='f'[0]
|
||||||
or '0'[0]<=s[ptr] and s[ptr]<='9'[0])) {
|
or '0'[0]<=s[ptr] and s[ptr]<='9'[0])) {
|
||||||
number~=chr(s[ptr]);
|
number~=chr(s[ptr]);
|
||||||
|
@ -83,21 +83,21 @@ var lexer = func(file) {
|
||||||
return;
|
return;
|
||||||
} elsif (ptr<len and chr(s[ptr])=='o') {
|
} elsif (ptr<len and chr(s[ptr])=='o') {
|
||||||
ptr+=1;
|
ptr+=1;
|
||||||
while(ptr<len and ('0'[0]<=s[ptr] and s[ptr]<='7'[0])) {
|
while (ptr<len and ('0'[0]<=s[ptr] and s[ptr]<='7'[0])) {
|
||||||
number~=chr(s[ptr]);
|
number~=chr(s[ptr]);
|
||||||
ptr+=1;
|
ptr+=1;
|
||||||
}
|
}
|
||||||
gen(num(number));
|
gen(num(number));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while(ptr<len and ('0'[0]<=s[ptr] and s[ptr]<='9'[0])) {
|
while (ptr<len and ('0'[0]<=s[ptr] and s[ptr]<='9'[0])) {
|
||||||
number~=chr(s[ptr]);
|
number~=chr(s[ptr]);
|
||||||
ptr+=1;
|
ptr+=1;
|
||||||
}
|
}
|
||||||
if (ptr<len and chr(s[ptr])=='.') {
|
if (ptr<len and chr(s[ptr])=='.') {
|
||||||
number~=chr(s[ptr]);
|
number~=chr(s[ptr]);
|
||||||
ptr+=1;
|
ptr+=1;
|
||||||
while(ptr<len and ('0'[0]<=s[ptr] and s[ptr]<='9'[0])) {
|
while (ptr<len and ('0'[0]<=s[ptr] and s[ptr]<='9'[0])) {
|
||||||
number~=chr(s[ptr]);
|
number~=chr(s[ptr]);
|
||||||
ptr+=1;
|
ptr+=1;
|
||||||
}
|
}
|
||||||
|
@ -109,7 +109,7 @@ var lexer = func(file) {
|
||||||
number~=chr(s[ptr]);
|
number~=chr(s[ptr]);
|
||||||
ptr+=1;
|
ptr+=1;
|
||||||
}
|
}
|
||||||
while(ptr<len and ('0'[0]<=s[ptr] and s[ptr]<='9'[0])) {
|
while (ptr<len and ('0'[0]<=s[ptr] and s[ptr]<='9'[0])) {
|
||||||
number~=chr(s[ptr]);
|
number~=chr(s[ptr]);
|
||||||
ptr+=1;
|
ptr+=1;
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@ var lexer = func(file) {
|
||||||
},
|
},
|
||||||
compile:func() {
|
compile:func() {
|
||||||
line=1;
|
line=1;
|
||||||
while(ptr<len) {
|
while (ptr<len) {
|
||||||
var c=s[ptr];
|
var c=s[ptr];
|
||||||
if (c=='#'[0])
|
if (c=='#'[0])
|
||||||
me.jmp_note();
|
me.jmp_note();
|
||||||
|
|
|
@ -8,9 +8,9 @@ for (var i=1;;i+=1)break;
|
||||||
for (var i=1;i<10;i+=1)
|
for (var i=1;i<10;i+=1)
|
||||||
print(i," ");
|
print(i," ");
|
||||||
print("\n");
|
print("\n");
|
||||||
while(1)break;
|
while (1)break;
|
||||||
var j=0;
|
var j=0;
|
||||||
while(j<10) {
|
while (j<10) {
|
||||||
print(j," ");
|
print(j," ");
|
||||||
j+=1;
|
j+=1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,7 @@ var ctx_info = func() {
|
||||||
}
|
}
|
||||||
var exec = func(info=1) {
|
var exec = func(info=1) {
|
||||||
println("[",os.time(),"] executing ...");
|
println("[",os.time(),"] executing ...");
|
||||||
while(1) {
|
while (1) {
|
||||||
ir=[mem[pc],mem[pc+1],mem[pc+2],mem[pc+3]];
|
ir=[mem[pc],mem[pc+1],mem[pc+2],mem[pc+3]];
|
||||||
if (info)ctx_info();
|
if (info)ctx_info();
|
||||||
var op=ir[0];
|
var op=ir[0];
|
||||||
|
|
|
@ -34,7 +34,7 @@ var cpu_stat = func() {
|
||||||
|
|
||||||
var cpu_occupation = func() {
|
var cpu_occupation = func() {
|
||||||
var first_in = 1;
|
var first_in = 1;
|
||||||
while(1) {
|
while (1) {
|
||||||
var cpu0 = cpu_stat();
|
var cpu0 = cpu_stat();
|
||||||
if (first_in) {
|
if (first_in) {
|
||||||
unix.sleep(0.05);
|
unix.sleep(0.05);
|
||||||
|
@ -75,7 +75,7 @@ var random_generator = func() {
|
||||||
var total = 0;
|
var total = 0;
|
||||||
var statistics = [];
|
var statistics = [];
|
||||||
setsize(statistics, 70);
|
setsize(statistics, 70);
|
||||||
while(1) {
|
while (1) {
|
||||||
for (var i=0;i<10;i+=1) {
|
for (var i=0;i<10;i+=1) {
|
||||||
total+=1;
|
total+=1;
|
||||||
var u=rand()*rand()*(rand()>0.5?-1:1);
|
var u=rand()*rand()*(rand()>0.5?-1:1);
|
||||||
|
@ -127,7 +127,7 @@ func() {
|
||||||
|
|
||||||
var bar=process_bar.high_resolution_bar(48);
|
var bar=process_bar.high_resolution_bar(48);
|
||||||
print("\ec");
|
print("\ec");
|
||||||
while(limited_loop!=0) {
|
while (limited_loop!=0) {
|
||||||
limited_loop=limited_loop<0?limited_loop:limited_loop-1;
|
limited_loop=limited_loop<0?limited_loop:limited_loop-1;
|
||||||
var mem=mem_occupation();
|
var mem=mem_occupation();
|
||||||
var mem_occ=(mem.MemTotal-mem.MemFree)/mem.MemTotal*100;
|
var mem_occ=(mem.MemTotal-mem.MemFree)/mem.MemTotal*100;
|
||||||
|
@ -135,7 +135,7 @@ func() {
|
||||||
mem_occ=0;
|
mem_occ=0;
|
||||||
}
|
}
|
||||||
var cpu_occ=nil;
|
var cpu_occ=nil;
|
||||||
while((cpu_occ=coroutine.resume(co)[0])==nil) {
|
while ((cpu_occ=coroutine.resume(co)[0])==nil) {
|
||||||
var key=libkey.nonblock();
|
var key=libkey.nonblock();
|
||||||
coroutine.resume(rd);
|
coroutine.resume(rd);
|
||||||
if (key!=nil and chr(key)=="q")
|
if (key!=nil and chr(key)=="q")
|
||||||
|
|
|
@ -6,11 +6,11 @@ var var_sort = func() {
|
||||||
var base=left+int(rand()*(right-left));
|
var base=left+int(rand()*(right-left));
|
||||||
(vec[left],vec[base])=(vec[base],vec[left]);
|
(vec[left],vec[base])=(vec[base],vec[left]);
|
||||||
var (i,j,tmp)=(left,right,vec[left]);
|
var (i,j,tmp)=(left,right,vec[left]);
|
||||||
while(i<j) {
|
while (i<j) {
|
||||||
while(i<j and tmp<vec[j])
|
while (i<j and tmp<vec[j])
|
||||||
j-=1;
|
j-=1;
|
||||||
vec[i]=vec[j];
|
vec[i]=vec[j];
|
||||||
while(i<j and vec[i]<tmp)
|
while (i<j and vec[i]<tmp)
|
||||||
i+=1;
|
i+=1;
|
||||||
vec[j]=vec[i];
|
vec[j]=vec[i];
|
||||||
j-=1;
|
j-=1;
|
||||||
|
|
|
@ -125,14 +125,14 @@ if (a and a.field == 42) {
|
||||||
|
|
||||||
#
|
#
|
||||||
# Looping constructs are mostly C-like. The differences are that
|
# Looping constructs are mostly C-like. The differences are that
|
||||||
# there is no do{}while(); construct, and there is a foreach, which
|
# there is no do {} while (); construct, and there is a foreach, which
|
||||||
# takes a local variable name as its first argument and a vector as
|
# takes a local variable name as its first argument and a vector as
|
||||||
# its second.
|
# its second.
|
||||||
#
|
#
|
||||||
var doSomething = dummyFunc;
|
var doSomething = dummyFunc;
|
||||||
|
|
||||||
var stillGoing = 0;
|
var stillGoing = 0;
|
||||||
while(stillGoing) { doSomething(); }
|
while (stillGoing) { doSomething(); }
|
||||||
|
|
||||||
for (var i=0; i < 3; i = i+1) {
|
for (var i=0; i < 3; i = i+1) {
|
||||||
elem = list1[i];
|
elem = list1[i];
|
||||||
|
|
|
@ -35,7 +35,7 @@ var game = func(x,y) {
|
||||||
var gameover=0;
|
var gameover=0;
|
||||||
var setapple = func() {
|
var setapple = func() {
|
||||||
var (cord_x,cord_y)=(int(rand()*x),int(rand()*y));
|
var (cord_x,cord_y)=(int(rand()*x),int(rand()*y));
|
||||||
while(vec[cord_x][cord_y]!=0)
|
while (vec[cord_x][cord_y]!=0)
|
||||||
(cord_x,cord_y)=(int(rand()*x),int(rand()*y));
|
(cord_x,cord_y)=(int(rand()*x),int(rand()*y));
|
||||||
vec[cord_x][cord_y]=2;
|
vec[cord_x][cord_y]=2;
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,7 @@ var game = func(x,y) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var co=coroutine.create(func() {
|
var co=coroutine.create(func() {
|
||||||
while(1) {
|
while (1) {
|
||||||
var moved=-1;
|
var moved=-1;
|
||||||
for (var i=0;i<30;i+=1) {
|
for (var i=0;i<30;i+=1) {
|
||||||
var ch=libkey.nonblock();
|
var ch=libkey.nonblock();
|
||||||
|
@ -140,8 +140,8 @@ var main = func(argv) {
|
||||||
}
|
}
|
||||||
print("\r \r");
|
print("\r \r");
|
||||||
var counter=20;
|
var counter=20;
|
||||||
while(1) {
|
while (1) {
|
||||||
while((var ch=coroutine.resume(co)[0])==nil);
|
while ((var ch=coroutine.resume(co)[0])==nil);
|
||||||
if (ch!=nil and ch!=-1) {
|
if (ch!=nil and ch!=-1) {
|
||||||
if (ch=='q'[0]) {
|
if (ch=='q'[0]) {
|
||||||
break;
|
break;
|
||||||
|
@ -165,7 +165,7 @@ var main = func(argv) {
|
||||||
if (should_skip) {
|
if (should_skip) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while(libkey.getch()!='q'[0]);
|
while (libkey.getch()!='q'[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
main(runtime.argv());
|
main(runtime.argv());
|
|
@ -304,7 +304,7 @@ var main = func(argv) {
|
||||||
map.print();
|
map.print();
|
||||||
|
|
||||||
var counter=init_counter;
|
var counter=init_counter;
|
||||||
while(1) {
|
while (1) {
|
||||||
# nonblock input one character
|
# nonblock input one character
|
||||||
var ch=libkey.nonblock();
|
var ch=libkey.nonblock();
|
||||||
if (ch) {
|
if (ch) {
|
||||||
|
@ -350,7 +350,7 @@ var main = func(argv) {
|
||||||
"\e[35mt\e[36mo \e[94mq\e[95mu\e[91mi\e[92mt\e[0m\n"
|
"\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]);
|
while (libkey.getch()!='q'[0]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ var run = func(table,start,stop) {
|
||||||
var (state,pointer)=(start,0);
|
var (state,pointer)=(start,0);
|
||||||
|
|
||||||
prt(state,pointer,paper);
|
prt(state,pointer,paper);
|
||||||
while(state!=stop) {
|
while (state!=stop) {
|
||||||
if (!contains(machine.states,state))
|
if (!contains(machine.states,state))
|
||||||
die("no matching function for state:"~state);
|
die("no matching function for state:"~state);
|
||||||
var found=0;
|
var found=0;
|
||||||
|
|
|
@ -4,13 +4,13 @@ use std.unix;
|
||||||
var argument = arg[0];
|
var argument = arg[0];
|
||||||
if (argument=="server") {
|
if (argument=="server") {
|
||||||
var server = udp.udp_server("127.0.0.1", 5506);
|
var server = udp.udp_server("127.0.0.1", 5506);
|
||||||
while(1) {
|
while (1) {
|
||||||
var message = server.recvfrom();
|
var message = server.recvfrom();
|
||||||
server.sendto(message.fromip, message.port, "from server");
|
server.sendto(message.fromip, message.port, "from server");
|
||||||
}
|
}
|
||||||
} elsif (argument=="client") {
|
} elsif (argument=="client") {
|
||||||
var client = udp.udp_client();
|
var client = udp.udp_client();
|
||||||
while(1) {
|
while (1) {
|
||||||
client.sendto("127.0.0.1", 5506, "hello");
|
client.sendto("127.0.0.1", 5506, "hello");
|
||||||
var message = client.recvfrom();
|
var message = client.recvfrom();
|
||||||
println(message);
|
println(message);
|
||||||
|
|
|
@ -53,7 +53,7 @@ if (size(argv)==2) {
|
||||||
|
|
||||||
var modified_time = io.fstat(filename).st_mtime;
|
var modified_time = io.fstat(filename).st_mtime;
|
||||||
println(os_time(), info_hd(), "watching ", filename, " ..");
|
println(os_time(), info_hd(), "watching ", filename, " ..");
|
||||||
while(1) {
|
while (1) {
|
||||||
unix.sleep(1);
|
unix.sleep(1);
|
||||||
if (!io.exists(filename)) {
|
if (!io.exists(filename)) {
|
||||||
println(os_time(), err_hd(), "file <", filename, "> does not exist");
|
println(os_time(), err_hd(), "file <", filename, "> does not exist");
|
||||||
|
@ -75,7 +75,7 @@ while(1) {
|
||||||
|
|
||||||
# check if active every 0.5s
|
# check if active every 0.5s
|
||||||
var exited = false;
|
var exited = false;
|
||||||
while(1) {
|
while (1) {
|
||||||
unix.sleep(0.5);
|
unix.sleep(0.5);
|
||||||
if (!subprocess.active(subproc)) {
|
if (!subprocess.active(subproc)) {
|
||||||
exited = true;
|
exited = true;
|
||||||
|
|
|
@ -21,7 +21,7 @@ if (size(arg)<1) {
|
||||||
|
|
||||||
var content = io.readfile(arg[0], "r");
|
var content = io.readfile(arg[0], "r");
|
||||||
var tail_len = 0;
|
var tail_len = 0;
|
||||||
while(math.mod(size(content), 256*3)!=0) {
|
while (math.mod(size(content), 256*3)!=0) {
|
||||||
content ~= "A";
|
content ~= "A";
|
||||||
tail_len += 1;
|
tail_len += 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std.unix;
|
||||||
|
|
||||||
println("[", os.time(), "] (=.=) auto push, please wait...");
|
println("[", os.time(), "] (=.=) auto push, please wait...");
|
||||||
|
|
||||||
while(system("git push")!=0) {
|
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);
|
unix.sleep(0.5);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue