task: conditional execution
This commit is contained in:
parent
a3f73278b1
commit
20cca772b8
|
@ -421,3 +421,34 @@ answer. Start from the first, and bump down if you need a hint.
|
|||
* tutorial/task10-hint1.mu
|
||||
* tutorial/task10-hint2.mu
|
||||
* tutorial/task10-hint3.mu
|
||||
|
||||
## Task 11: conditionally executing statements
|
||||
|
||||
Here's a fragment of Mu code:
|
||||
|
||||
```
|
||||
{
|
||||
compare x, 0
|
||||
break-if-<
|
||||
x <- copy 0
|
||||
}
|
||||
```
|
||||
|
||||
The combination of `compare` and `break` results in the variable `x` being
|
||||
assigned 0 _if and only if_ its value was less than 0 at the beginning. The
|
||||
`break` family of instructions is used to jump to the end of an enclosing `{}`
|
||||
block, skipping all intervening instructions.
|
||||
|
||||
To prepare for this task, read the sections in the Mu reference on
|
||||
[`compare`](https://github.com/akkartik/mu/blob/main/mu.md#comparing-values)
|
||||
and [branches](https://github.com/akkartik/mu/blob/main/mu.md#branches).
|
||||
|
||||
Now make the tests pass in `tutorial/task11.mu`. The goal is to implement our
|
||||
colloquial understanding of the “difference” between two numbers.
|
||||
In lay English, we say the difference between the first-place and third-place
|
||||
runner in a race is two places. This answer doesn't depend on the order in
|
||||
which we mention the runners; the difference between third and first is also
|
||||
two.
|
||||
|
||||
The section on [integer arithmetic](https://github.com/akkartik/mu/blob/main/mu.md#integer-arithmetic)
|
||||
is again worth referring to when working on this task.
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
fn difference a: int, b: int -> _/eax: int {
|
||||
var result/eax: int <- copy a
|
||||
result <- subtract b
|
||||
compare result, 0
|
||||
{
|
||||
break-if->=
|
||||
result <- negate
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
fn test-difference {
|
||||
var result/eax: int <- difference 5, 3
|
||||
check-ints-equal result, 2, "F - difference works"
|
||||
result <- difference 3, 5
|
||||
check-ints-equal result, 2, "F - difference is always positive"
|
||||
result <- difference 6, 6
|
||||
check-ints-equal result, 0, "F - difference can be 0"
|
||||
}
|
||||
|
||||
fn main screen: (addr screen) {
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
fn difference a: int, b: int -> _/eax: int {
|
||||
}
|
||||
|
||||
fn test-difference {
|
||||
var result/eax: int <- difference 5, 3
|
||||
check-ints-equal result, 2, "F - difference works"
|
||||
result <- difference 3, 5
|
||||
check-ints-equal result, 2, "F - difference is always positive"
|
||||
result <- difference 6, 6
|
||||
check-ints-equal result, 0, "F - difference can be 0"
|
||||
}
|
||||
|
||||
fn main screen: (addr screen) {
|
||||
}
|
Loading…
Reference in New Issue