-
Notifications
You must be signed in to change notification settings - Fork 0
/
loops.jai
83 lines (64 loc) · 1.78 KB
/
loops.jai
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
main :: () {
// You can break/continue specific loops by assigning a name to the looping condition
i := 0;
while outer_loop := i < 2 {
defer i += 1;
// can also loop on types other than bool, when they are not 0
while inner_loop := i {
// What is this var that names the loop?
// it is literally the value you assign to it.
print_expr(inner_loop); // here it's the value of i
print_expr(outer_loop); // for bools it is always true.
// Can it be written to?
outer_loop = false; // yes it can. This does not affect the loop.
print_expr(outer_loop);
// this inner loop is only as an example, just break right away so it only runs once.
break inner_loop;
}
write_string("---\n");
}
str := #string LINES
this
is
a
set
of
lines
LINES;
// Can you use this variable that names the loop in a similar way to
// how you can make iterators in Odin? Not quite.
// Uing multiple return values at the start of a while loop is not supported
//while loop_1, line := iterate_lines(*str) {
// print("\"%\"\n", line);
//}
// So to make this work, you have to pass in a pointer instead.
line: string;
while loop_1 := iterate_lines(*str, *line) {
print("\"%\"\n", line);
}
}
iterate_lines :: (str: *string) -> bool, string {
for 0..str.count-1 {
if str.*[it] == #char "\n" {
line := iview(str, to = it);
str.* = iview(str, from = it+1);
return true, line;
}
}
defer str.* = "";
return str.count != 0, str.*;
}
iterate_lines :: (str: *string, line: *string) -> bool #expand {
ok: bool;
ok, line.* = iterate_lines(str);
return ok;
}
as_ascii_char :: (num: u8) -> string #expand {
// must be a macro or *num gets invalidated after return
str: string;
str.count = 1;
str.data = *num;
return str;
}
#load "../jai_sanian/view.jai";
#load "sandbox.jai";