101 lines
1.4 KiB
Markdown
101 lines
1.4 KiB
Markdown
|
# Value cloning
|
||
|
Sometimes in Granite, you may want to _clone_ variables. This is fairly easy with one operation!
|
||
|
|
||
|
## New operations
|
||
|
* `:%(source),(target)`, variable clone, sets `(target)` to the value in `(source)`
|
||
|
|
||
|
## Tutorial
|
||
|
Imagine you want to create a program to calculate a Fibonacci sequence up to a certain term.
|
||
|
|
||
|
The first two numbers of the sequence are 0 and 1 and each next term is the sum of the previous two meaning that number #3 is number #1 (0) plus number #2 (1)
|
||
|
|
||
|
We can begin the program by initialising and printing the first terms and the counter and asking the user for a term:
|
||
|
|
||
|
```
|
||
|
:0 Init variables and ask user for term
|
||
|
:?a
|
||
|
:>2,i
|
||
|
:>0,x
|
||
|
:>1,y
|
||
|
:>0,z
|
||
|
|
||
|
:0 print term 0 and term 1 and stop if user didnt want more
|
||
|
:!x
|
||
|
:=exit,a,0
|
||
|
:!y
|
||
|
:=exit,a,1
|
||
|
|
||
|
:0 increment a for loop purposes
|
||
|
:^a
|
||
|
```
|
||
|
|
||
|
Now for the loop, first we want to perform the addition and increment i:
|
||
|
|
||
|
```
|
||
|
:@loop
|
||
|
:ax,y,z
|
||
|
:!z
|
||
|
:^i
|
||
|
```
|
||
|
|
||
|
Now we want to move the new term into `y` and the `y` term into `x`.
|
||
|
|
||
|
```
|
||
|
:%y,x
|
||
|
:%z,y
|
||
|
```
|
||
|
|
||
|
We need to clone the `y` term into `x` _first_
|
||
|
|
||
|
Now add the loop operation and premature exit label.
|
||
|
|
||
|
```
|
||
|
:-loop,i,a
|
||
|
:@exit
|
||
|
:~
|
||
|
```
|
||
|
|
||
|
Now run the program, you'll get an output similar to this after entering a number:
|
||
|
|
||
|
```
|
||
|
? 12
|
||
|
0
|
||
|
1
|
||
|
1
|
||
|
2
|
||
|
3
|
||
|
5
|
||
|
8
|
||
|
13
|
||
|
21
|
||
|
34
|
||
|
55
|
||
|
89
|
||
|
144
|
||
|
```
|
||
|
|
||
|
Congratulations! Now you can clone variables!
|
||
|
|
||
|
## After example
|
||
|
```
|
||
|
:?a
|
||
|
:>2,i
|
||
|
:>0,x
|
||
|
:>1,y
|
||
|
:>0,z
|
||
|
:!x
|
||
|
:=exit,a,0
|
||
|
:!y
|
||
|
:=exit,a,1
|
||
|
:^a
|
||
|
:@loop
|
||
|
:ax,y,z
|
||
|
:!z
|
||
|
:^i
|
||
|
:%y,x
|
||
|
:%z,y
|
||
|
:-loop,i,a
|
||
|
:@exit
|
||
|
:~
|
||
|
```
|