diff --git a/SPECIFICATION.MD b/SPECIFICATION.MD index cbe98a0..27fdf1b 100644 --- a/SPECIFICATION.MD +++ b/SPECIFICATION.MD @@ -174,12 +174,12 @@ So as you can see each type includes some extra information, its type, if it has ``` frm «form_token» impls «this_form», «that_form» { - version : [0, 0, 1] ! version number for auto saving to a database or whatnot - migrate : <> ! this is to migrate from the previous version to new, in case of interface changes, or None - dimensions : 0 ! this returns how many dimensions it can exist in, 0th means non drawable, 2 means 2D GUI usually, 3 means 3D object, and >3 is somthing you will have to implement yourself, e.g. miegakure - unit : <> ! this is for the unit/measures system - display : <> ! some kind of UI form or None - position : <> ! a position in space or None + version; ! version number for auto saving to a database or whatnot + migrate; ! this is to migrate from the previous version to new, in case of interface changes, or None + dimensions; ! this returns how many dimensions it can exist in, 0th means non drawable, 2 means 2D GUI usually, 3 means 3D object, and >3 is somthing you will have to implement yourself, e.g. miegakure + unit; ! this is for the unit/measures system + display; ! some kind of UI form or None + position; ! a position in space or None } ``` @@ -209,37 +209,6 @@ matching `""` for string strings are always utf8, other formats will need to be done manually -## measurement - -- forms - - time - - unit - - seconds (s) - - subforms - - date - - Default is ISO 8601 - - length - - unit - - metre (m) - - subforms - - angle - - radian (rad) - - mass - - unit - - kilogram (kg) - - electric current - - unit - - ampere (a) - - temperature - - unit - - kelvin (K) - - amount of substance - - unit - - mol (mol) - - luminous intensity - - unit - - candela (candela) - ## logical `bool` @@ -250,38 +219,33 @@ Also follows the style boolean 'c' rules of nonzero / zero, but the interpreter ## null values -### *zwl* does not have null, it stole some monads from Rust, Haskell, and the like +*zwl* does not have null, because each value can have an error on it. -If you are coming from haskell, a 'Just' is `< some value >` and a 'None' is `<>`, note 'None' is also an error +error is a form which describes an error that occurred, it is similar to the Go programming language and is returned as a monad like the maybe monad above and is unwrapped in a similar way, take a look at the tunnel section for an example -Like in Rust you have `unwrap` and `unwrap_or` and the like, you use `?` and `??` ``` -1| i32 a = <3>; ! this can also be writen `i32 a = just(3);` -2| i32 b = <>; ! this can also be written `i32 b = none;` +1| i32 a = 3; ! this would be similar to the follwing in Rust: `let a: Result = Ok(3);` +2| i32 b; ! or like in Rust: `let b: Result;` 3| -4| i32 x ?= a; ! this will set x to 3 -5| i32 y ?= b; ! this will set y to an error -6| i32 z ?= b ?= 1; ! this will return an error from b, then unwrap the error and set y = 1; +4| i32 x = a; ! this will set x to 3 +5| i32 y = b; ! this will set the error part of y to an undefined error because we tried setting a undefined variable to another variable, imagine in Rust: `let y: Result = Err("undefined");` +6| i32 z = b ? 1; ! this will check if b has an error and since it does it will set y = 1; 7| 8| print("$x $y $z\n") ! prints 3, "error: failed to unwrap a 'none' on line 5", 1 ``` -additionally, a None will be evaluated as "false" and Just as "true" in a boolean check - -## error - -error is a form which describes an error that occurred, it is similar to the Go programming language and is returned as a monad like the maybe monad above and is unwrapped in a similar way, take a look at the tunnel section for an example +additionally, if a value has an error it will evaluate as "false" and Just as "true" in a boolean check, unless you are explicitly checking for an error ### panic calling panic on a variable that has an error will halt execution of the node that is running. ``` - i32 n = <>; ! this can also be written `i32 b = none;` - i32 e ?= n; ! this will be an error - if (e.err) { ! since the 'none' error is zero this will only branch if an error exists on the variable - panic(e); + i32 n; + i32 e = n; ! this will set e's error that we tried setting n to undefined. + err (e) { ! we can check if there is an error by using the `err` keyword in the same way as an `if` + panic(e); ! panic will halt exectution of the task and pass a message what the error was to all the other tasks listening. } ``` @@ -591,3 +555,34 @@ test some_test { ``` +## Measurement + +- forms + - time + - unit + - seconds (s) + - subforms + - date + - Default is ISO 8601 + - length + - unit + - metre (m) + - subforms + - angle + - radian (rad) + - mass + - unit + - kilogram (kg) + - electric current + - unit + - ampere (a) + - temperature + - unit + - kelvin (K) + - amount of substance + - unit + - mol (mol) + - luminous intensity + - unit + - candela (candela) +