If statements#
Code Example
Runnable Example in Jac and JacLib
# If Statements
with entry {
# Basic if statement
x = 10;
if x > 5 {
print("x is greater than 5");
}
# If-else statement
age = 18;
if age >= 18 {
print("adult");
} else {
print("minor");
}
# If-elif-else chain
score = 85;
if score >= 90 {
print("A");
} elif score >= 80 {
print("B");
} elif score >= 70 {
print("C");
} else {
print("F");
}
# Multiple elif chains
value = 15;
if value < 5 {
print("very low");
} elif value < 10 {
print("low");
} elif value < 15 {
print("medium");
} elif value < 20 {
print("high");
} else {
print("very high");
}
# Nested if statements
a = 15;
b = 20;
if a > 10 {
print("a > 10");
if b > 15 {
print("b > 15");
if a + b > 30 {
print("a + b > 30");
}
}
}
# Complex boolean expressions
if a > 5 and b > 10 {
print("both conditions true");
}
if a > 100 or b > 15 {
print("at least one true");
}
if not (a > 50) {
print("negation true");
}
if (a > 5 and b > 10) or (a < 20) {
print("complex expression true");
}
# Chained comparisons
temp = 25;
if 20 <= temp <= 30 {
print("comfortable temperature");
}
# Membership tests
fruits = ["apple", "banana"];
if "apple" in fruits {
print("apple found");
}
if "grape" not in fruits {
print("grape not found");
}
# Identity tests
val = None;
if val is None {
print("val is None");
}
if val is not None {
print("val is not None");
} else {
print("val is None");
}
}
Jac Grammar Snippet
Description
If Statements in Jac
If statements provide conditional control flow through if
, elif
, and else
keywords. They allow code to execute different paths based on boolean conditions.
Basic If Statement
Lines 4-8 demonstrate the simplest conditional. When the condition x > 5
evaluates to true, the block executes.
If-Else Statement
Lines 11-16 show binary choice logic. Exactly one block executes: the if
block when true, otherwise the else
block.
If-Elif-Else Chain
Lines 19-28 demonstrate multiple exclusive conditions. Evaluation is top-down. The first true condition executes, then the entire chain terminates.
Multiple Elif Branches
Lines 31-42 show extended conditional chains with many branches. Each elif
provides an additional condition to check if previous conditions were false.
Nested If Statements
Lines 45-55 demonstrate if statements within if statements. Inner conditions only evaluate if outer conditions are true.
Complex Boolean Expressions
Lines 58-72 show combining conditions with logical operators:
AND operator (line 58-60):
Both conditions must be true.
OR operator (line 62-64):
At least one condition must be true.
NOT operator (line 66-68):
Negates the condition.
Combined operators (line 70-72):
Parentheses control precedence.
Chained Comparisons
Lines 75-78 demonstrate Python-style chained comparisons. Equivalent to 20 <= temp and temp <= 30
, but evaluates temp
only once.
Membership Tests
Lines 81-88 show in
and not in
operators. Works with any iterable: lists, tuples, sets, dictionaries (checks keys), strings.
Identity Tests
Lines 91-100 demonstrate is
and is not
for identity checking. Use is
for None checks, not ==
.
Comparison Operators
Operator | Meaning | Example Line |
---|---|---|
== |
Equal | Throughout |
!= |
Not equal | Implicit |
< |
Less than | 32 |
<= |
Less than or equal | 76 |
> |
Greater than | 6 |
>= |
Greater than or equal | 12, 20 |
is |
Identity | 92 |
is not |
Not identity | 96 |
in |
Membership | 82 |
not in |
Non-membership | 86 |
Logical Operators
Operator | Meaning | Precedence |
---|---|---|
not |
Negation | Highest |
and |
Both must be true | Medium |
or |
At least one must be true | Lowest |
Control Flow Diagram
flowchart TD
Start([If Statement]) --> Cond1{If Condition<br/>True?}
Cond1 -->|Yes| IfBlock[Execute If Block]
Cond1 -->|No| Elif{Elif<br/>Present?}
IfBlock --> Done([Continue])
Elif -->|Yes| ElifCond{Elif Condition<br/>True?}
Elif -->|No| Else{Else<br/>Present?}
ElifCond -->|Yes| ElifBlock[Execute Elif Block]
ElifCond -->|No| NextElif{More<br/>Elif?}
ElifBlock --> Done
NextElif -->|Yes| ElifCond
NextElif -->|No| Else
Else -->|Yes| ElseBlock[Execute Else Block]
Else -->|No| Done
ElseBlock --> Done
Truthy and Falsy Values
Jac follows Python's truthiness rules:
Falsy values:
- False
- None
- 0
(numeric zero)
- ""
(empty string)
- []
(empty list)
- {}
(empty dict)
Truthy values: - Everything else
Example:
Common Patterns
Guard pattern (early return):
Range checking:
None checking:
Membership filtering:
Multi-condition validation:
Short-Circuit Evaluation
and
and or
use short-circuit evaluation:
If x != 0
is false, y / x
doesn't execute (preventing division by zero).
If Expression (Ternary)
Jac supports if expressions for value selection:
If expressions must have an else clause and return a value.
Block Syntax Rules
- Braces required:
{ }
delimit blocks, not indentation - Semicolons required: Each statement ends with
;
- Single-line allowed:
if x > 5 { print("yes"); }
is valid - Multi-line preferred: For readability
If Statement vs If Expression
Feature | If Statement | If Expression |
---|---|---|
Syntax | if cond { ... } else { ... } |
val1 if cond else val2 |
Returns value | No | Yes |
Multiple statements | Yes | No (expressions only) |
Else required | No | Yes |
Use case | Control flow | Value selection |
Key Differences from Python
- Braces required: Jac uses
{ }
, not indentation - Semicolons required: Each statement ends with
;
- Same truthiness: Empty collections are falsy
- Same operators:
and
,or
,not
,in
,is
- Same chaining:
a <= b <= c
works identically