What’s the value of a conditional clause?

CodingEverything else

No, seriously, bear with me. I haven’t lost my mind. Consider the following.
Joe, a citizen of Utopia, makes Ut$142,000 a year. In Utopia, you pay 25% on your first Ut$120,000 and from there on 35% on all earnings above. Let’s calculate Joe’s tax rate.
Trivial, no? JavaScript:

var income = 142000;
var tax_to_pay = 0;
if(income <= 120000){
 tax_to_pay = income * 0.25;
} else {
 tax_to_pay = 30000 + (income - 120000) * 0.35;
}
console.log(tax_to_pay);

And Python:

income = 142000
if income <= 120000
    tax_to_pay = income * 0.25
else
    tax_to_pay = 30000 + (income - 120000) * 0.35
print(tax_to_pay)

And so on. Now let’s consider the weirdo in the ranks, Julia:

income = 142000
if income <= 120000:
    tax_to_pay = income * 0.25
else
    tax_to_pay = 30000 + (income - 120000) * 0.35
end

Returns 37700.0 all right. But now watch what Julia can do and the other languages (mostly) can’t! The following is perfectly correct Julia code.

income = 142000
tax_to_pay = (if income <= 120000
                  income * 0.25
              else
                  30000 + (income - 120000) * 0.35
              end)
print(tax_to_pay)

This, too, will return 37700.0. Now, you might say, that’s basically no different from a ternary operator. Except unlike with ternary ops in most languages, you can actually put as much code there as you want and have as many side effects as your heart desires, while still being able to assign the result of the last calculation within the block that ends up getting executed to the variable at the head.
Now, that raises the question of what the value of a while expression is. Any guesses?

i = 0
digits = (while i < 10
                i = i + 1
          end)

Well, Julia says 0123456789 when executing it, so digits surely must be…

julia> digits

Wait, wat?! That must be wrong. Let’s type check it.

julia> typeof(digits)
Void

So there you have it. A conditional has a value, a while loop doesn’t… even if both return a value. Sometimes, you’ve gotta love Julia, kick back with a stiff gin and listen to Gary Bernhardt.

Chris von Csefalvay
Chris von Csefalvay is a data scientist/computational epidemiologist specialising in the dynamics of infectious disease and AI-based, data-driven solutions to public health problems.

You may also like

4 Comments

  1. Ah, but scoping. Is the i outside the same i that’s inside the while loop?
    If it constructs its own i, it’s possible that it also destructs that i before the end statement, which would leave nothing (or Void) to be returned back to the rest of the assignment statement.

    1. Julia while scopes are leaky and use global scope vars. It doesn’t construct its own i.

  2. Oh yeah, also note that you’re doing an assignment statement in the while loop while just evaluating an expression in the if statement. There’s nothing that the while loop leaves on the stack. You’d need to stick an expression past the end of the while loop to leave something to assign to the digits variable.

    1. Exactly! 🙂

Leave a Reply