aboutsummaryrefslogtreecommitdiffhomepage
path: root/notes/ifelse_interlude.txt
blob: 326a30625a4d128d1bf093298ea1506722df066d (plain)
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

if-then-else interlude
======================

It is common to have a sequence of else-if that depend on a common value
that can't be obtained at the beginning of the if's.

One way is to use nested if-else's, but then the indentation gets deep quickly.

Solution with nested if-else's
------------------------------

This can lead to deep indentations.

    if read_type() == .greyscale {
        int v = read_number()
        ...
    } else {
        int r = read_number()
        int g = read_number()
        int b = read_number()
        if (r > 128 && g < r) {
            ...
        } else if (b > 128 && g < b) {
            ...
        } else {
            ...
        }
    }


Solution with "interlude" clause
--------------------------------

    if read_type() == .greyscale {
        int v = read_number()
        ...
    } interlude {
        int r = read_number()
        int g = read_number()
        int b = read_number()
    } else if (r > 128 && g < r) {
        ...
    } else if (b > 128 && g < b) {
        ...
    } else {
        ...
    }


Solution with "with" statement
------------------------------

    if read_type() == .greyscale {
        int v = read_number()
        ...
    } else
    with int r = read_number()
    with int g = read_number()
    with int b = read_number()
    if (r > 128 && g < r) {
        ...
    } else if (b > 128 && g < b) {
        ...
    } else {
        ...
    }

As a bonus, this can also be used with loops:

    with Sponge sp = get_sponge()
    while sp.squeeze() {
        ...
    }
    # sp goes out of scope here.
    # no risk of accidental usage after loop.