Conditional Expressions
Basic Syntax
Wyrd provide three kind of syntax for structuring conditional expressions.
"One-Liner" If-Arrow Expression
If you want to directly output a value or a simple operation result, you can use the if <condition> => <expression>
format of the conditional expression:
Num age = 20
# Only If-Arrow Expression
if age < 18 => "youngster"
# If-Else-Arrow Expression to output alternative value
if age < 18 => "youngster"
else => "adult"
# If-Else-If-Arrow Expression to chain more conditional expressions
if age < 18 => "youngster"
elif age < 60 => "adult"
else => "elder"
Notice that the if <condition> ... else if ...
part, the keyword to chain the expression is simplified into elif
keyword.
"Single-Line-Block" If-Then Expression
The second conditional expression syntax style is the if <condition> then ...
style. You will need to change to new line after the then
keyword.
Notice that, then
block only evaluates single line expression as the result, and since the then
expression is block format, to close the expression, we need to use the end
keyword.
Num age = 20
# Only If-Then Expression
if age < 18 then
"youngster"
end
# If-Else-Then Expression to output alternative value
if age < 18 then
"youngster"
else then
"adult"
end
# If-Else-If-Then Expression to chain more conditional expressions
if age < 18 then
"youngster"
elif age < 60 then
"adult"
else then
"elder"
end
The compile result will be identical to the previous if-arrow
conditional example in previous section.
"Multi-Line Block" If-Do Expression
In Wyrd, if the content to be evaluated cannot easily be expressed in single-line, you can instead use the do
block expression which it will use the last expression in the do
block expression as return value.
Bool cond1 = True
Bool cond2 = False
# Only the If-Do Expression
if cond1 do
Num a = 123
Num b = 456
a + b # <-- returns this result if condition is True
end
# If-Else-Do Expression
if cond1 do
Num a = 123
Num b = 456
a + b # <-- returns this result if condition is True
else do
Num a = 789
Num b = 987
b - a # <-- returns this result if condition is False
end
# If-Else-If-Do Expression
if cond1 do
Num a = 123
Num b = 456
a + b # <-- returns this result if cond1 is True
elif cond2 do
Num a = 789
Num b = 987
b - a # <-- returns this result if cond2 is True
else do
Num a = 123
Num b = 789
a * b # <-- returns this result if cond1 and cond2 are False
end
By inspecting the Wyrd compilation result, we can see that Wyrd automatically compiles the do
block conditional expression using JavaScript IIFE (Immediately Invoked Function Expression).
Conditional Expression Returns Value
As described partially in the previous section, since most of the syntax in Wyrd are expressions, it will return values. In other words, we can do something like, for instance, assigning the evaluation result of conditional expression to a variable.
TODO: Advanced information about Wyrd - Most of the Wyrd program are expressions.
Num age = 20
Str type = if age < 18 => "youngster"
else => "adult"
const age = 20;
const type = age < 18 ? 'youngster' : 'adult';
If-Condition Must Receive Boolean Type
In JavaScript, values, such as number 0, empty string ... etc, are tend to be false
if they are used as the condition in conditional statement:
if (0) {
console.log("It won't execute this!");
}
However, Wyrd strictly limited developers to only provide any expressions which returns value of type Bool
. Hence, the following Wyrd program will throw error:
Num someNumber = 0
Str foo = if someNumber => "is not Zero"
else => "is Zero"
Expect conditional expression's condition should return `Bool` type, instead got: `Num`
If you want to check if something is (or is not) 0, you should instead explicitly point out within the condition. Thus, the previous program example might need to adjust into:
Num someNumber = 0
Str foo = if someNumber != 0 => "is not Zero"
else => "is Zero"
const someNumber = 0;
const foo = someNumber !== 0 ? 'is not Zero' : 'is Zero';
Return Type of Each Branch Must Be Identical
Since Wyrd is strongly typed programming language, it will automatically check each conditional branch's returned result.
If Wyrd found out that the return type of either one or more branches differ, then it will raise error:
Num age = 20
if age < 18 => "youngster"
elif age < 60 => "adult"
else => False
Expect values returned from different condition branch to be the same
TODO: Error message might need to be more comprehensive, e.g. pointing out the branch where returned type differs.
Conditional Expressions Without Else Part Returns "Maybe" Types
If a conditional expression lacks the else
expression, since the condition might be False
, it will instead return Null
value in default. (See Variable Declarations)
Hence, the return type of the conditional expression without else
expression will return maybe
type data. (See Built-in Types)
Num age = 20
mutable maybe Str type = if age < 18 => "youngster"
const age = 20;
let type = age < 18 ? 'youngster' : null;
Last updated
Was this helpful?