diff --git a/stl/lib.nas b/stl/lib.nas index a271acd..4565162 100644 --- a/stl/lib.nas +++ b/stl/lib.nas @@ -139,7 +139,8 @@ var math= ln: func(x) {return __builtin_ln(x); }, sqrt: func(x) {return __builtin_sqrt(x); }, atan2: func(x,y){return __builtin_atan2(x,y);}, - nan: func() {return 1/0-1/0; }, + inf: 1/0, + nan: 1/0-1/0, isnan: func(x) {return __builtin_isnan(x); } }; diff --git a/stl/result.nas b/stl/result.nas new file mode 100644 index 0000000..e7b4159 --- /dev/null +++ b/stl/result.nas @@ -0,0 +1,28 @@ + +import("lib.nas"); +var ResultTrait={ + Ok:func(val){ + me.ok=val; + me.flag=0; + return me; + }, + Err:func(info){ + me.err=info; + me.flag=1; + return me; + }, + unwrap:func(){ + if(me.flag) + die("error: "~me.err); + return me.ok; + } +}; + +var Result=func(){ + return{ + ok:nil, + err:"", + flag:1, + parents:[ResultTrait] + }; +}; \ No newline at end of file diff --git a/test/exception.nas b/test/exception.nas new file mode 100644 index 0000000..5e0ecc6 --- /dev/null +++ b/test/exception.nas @@ -0,0 +1,39 @@ +import("lib.nas"); + +var ResultTrait={ + Ok:func(val){ + me.ok=val; + me.flag=0; + return me; + }, + Err:func(info){ + me.err=info; + me.flag=1; + return me; + }, + unwrap:func(){ + if(me.flag) + die("error: "~me.err); + return me.ok; + } +}; + +var Result=func(){ + return{ + ok:nil, + err:"", + flag:1, + parents:[ResultTrait] + }; +}; + +var a=func(){ + return Result().Ok("hello world"); +} + +var b=func(){ + return Result().Err("unknown"); +} + +println(a().unwrap()); +b().unwrap(); \ No newline at end of file