64 lines
1.6 KiB
Markdown
64 lines
1.6 KiB
Markdown
|
# Type checking
|
||
|
Granite contains two types: integers and strings, and due to how some operations work it may be worth type checking these explicitly within the code.
|
||
|
|
||
|
## New operations
|
||
|
* `:&(variable),(output)`, type check, if `(variable)` is an integer then set `(output)` to 1 otherwise set `(output)` to 0
|
||
|
|
||
|
## Tutorial
|
||
|
Look at this simple program:
|
||
|
|
||
|
```
|
||
|
:?x
|
||
|
:^x
|
||
|
:!x
|
||
|
```
|
||
|
|
||
|
This program simply asks the user for a number and adds 1 to it.
|
||
|
|
||
|
This program works fine _provided the user inputs a number_.
|
||
|
|
||
|
```
|
||
|
? 50
|
||
|
51
|
||
|
```
|
||
|
|
||
|
But things begin to fall apart if the user does not input an integer.
|
||
|
|
||
|
```
|
||
|
? I'm an evil string! >:)
|
||
|
Non-number variable x on increment.
|
||
|
```
|
||
|
|
||
|
Type checking can solve this problem by allowing the programmer to safely recover when an invalid type is detected.
|
||
|
|
||
|
Firstly, we want to make the question a label so make a label called `question` above `:?x`.
|
||
|
|
||
|
Also add a [variable drop](dropping-variables.md) after the `question` label but _before_ asking the user for `x`.
|
||
|
|
||
|
Now directly after `:?x` but _before_ `:^x` we want to add the type check operation so add `:&x,type` after `:?x`.
|
||
|
|
||
|
Now we will have an integer corresponding to whether `x` is an integer or not. So _now_ after `:&x,type` you can add a conditional jump that jumps to the `question` label if `type` is equal to `0` which means that the user inputted a string.
|
||
|
|
||
|
Now our program is immune to strings messing things up:
|
||
|
|
||
|
```
|
||
|
? I'm an evil string! >:)
|
||
|
? No strings? :(
|
||
|
? 10
|
||
|
11
|
||
|
```
|
||
|
|
||
|
## Extension
|
||
|
Can you prompt the user to input an integer after incorrectly putting in a string?
|
||
|
|
||
|
## After example
|
||
|
```
|
||
|
:@question
|
||
|
:$x
|
||
|
:?x
|
||
|
:&x,type
|
||
|
:=question,type,0
|
||
|
:^x
|
||
|
:!x
|
||
|
```
|