granite-docs/docs/type-checking.md

64 lines
1.6 KiB
Markdown
Raw Normal View History

2024-08-16 14:48:06 +01:00
# 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
```