Update SPECIFICATION.MD
This commit is contained in:
		
							parent
							
								
									3ac54394de
								
							
						
					
					
						commit
						6c83ee3614
					
				
							
								
								
									
										103
									
								
								SPECIFICATION.MD
								
								
								
								
							
							
						
						
									
										103
									
								
								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<i32, &'static str> = Ok(3);`
 | 
			
		||||
2| i32 b;     ! or like in Rust: `let b: Result<i32, &'static str>;`
 | 
			
		||||
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<i32, &'static str> = 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)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue