52 lines
1.0 KiB
Go
52 lines
1.0 KiB
Go
package main
|
|
|
|
func main() {
|
|
for _, label := range complexOrder() {
|
|
println(label)
|
|
}
|
|
}
|
|
|
|
func complexOrder() (res []string) {
|
|
record := func(label string) { res = append(res, label) }
|
|
|
|
defer record(label1("cleanup-final", 0))
|
|
defer record(label1("cleanup-before-loop", 0))
|
|
|
|
for i := 0; i < 2; i++ {
|
|
defer record(label1("exit-outer", i))
|
|
for j := 0; j < 2; j++ {
|
|
if j == 0 {
|
|
defer record(label2("branch-even", i, j))
|
|
} else {
|
|
defer record(label2("branch-odd", i, j))
|
|
}
|
|
for k := 0; k < 2; k++ {
|
|
nested := label3("nested", i, j, k)
|
|
defer record(nested)
|
|
if k == 1 {
|
|
defer record(label3("nested-tail", i, j, k))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
defer record(label1("post-loop", 0))
|
|
return
|
|
}
|
|
|
|
func label1(prefix string, a int) string {
|
|
return prefix + "-" + digit(a)
|
|
}
|
|
|
|
func label2(prefix string, a, b int) string {
|
|
return prefix + "-" + digit(a) + "-" + digit(b)
|
|
}
|
|
|
|
func label3(prefix string, a, b, c int) string {
|
|
return prefix + "-" + digit(a) + "-" + digit(b) + "-" + digit(c)
|
|
}
|
|
|
|
func digit(n int) string {
|
|
return string(rune('0' + n))
|
|
}
|