Just leaving this here.

```for var i = 0, j = 1; i < 5; i += 1, j = 1 << i, print("values", i, j) {
print("2^\(i) is \(j)")
}```

Is basically:

```for <variable declarations>; <end condition test>; <updates> {
<body>
}
```

Update: So why did I pick this loop in the first place? I googled around for the ugliest most complicated examples I could that involved multiple variables and side effects. I want to show that there’s a simple mechanical conversion, even for the crazy.

And you can change this to this:

```do {
<variable declarations>
while <end condition test> {
<body>
}
}
```

Like this:

```do {
var i = 0, j = 1
while i < 5 {
print("2^\(i) is \(j)")
i += 1; j = 1 << i; print("values", i, j)
}
}```

Or this, if you’d like to keep the original bits all together, you can use defer. Note that any early loop termination will still trigger the defer block.

```do {
<variable declarations>
while <end condition test> {
<body>
}
}
```

Like this:

```do {
var i = 0, j = 1
while i < 5 {
defer { i += 1; j = 1 << i; print("values", i, j) }
print("2^\(i) is \(j)")
}
}```

And yes, you can still use break and continue

```do {
// Count to 49 by 2s
var i = 0, j = 100
while true {
defer { i += 1; j -= 1 }
if i % 2 == 0 { continue }
if i >= j { break }
print(i, terminator:" ")
}
print("")
}```

And labels

``` do {
// count to 23 by 2s
var i = 0, j = 100
outer: while true {
inner: while i < j {
i += 1; j -= 1
if i % 2 == 0 { continue inner } // same as continue
print(i, terminator: " ")
if i == 23 { break outer }
}
}
print("")
}```

# One Comment

• shouldn’t we all just be using tail call optimized recursive functions? 🙂