Your First L4 File
Create, run, and test a simple L4 program.
Audience: Anyone new to L4
Prerequisites: L4 tools installed (VS Code extension or CLI)
Time: 15 minutes
Goal: Create a working L4 file that defines a legal rule and tests it
What You'll Build
A simple eligibility rule: "A person is eligible if they are at least 18 years old and have valid ID."
Complete example:
-- Simple eligibility example from documentation
§ `Eligibility Rule`
-- Define the Person type
DECLARE Person
HAS name IS A STRING
age IS A NUMBER
hasValidID IS A BOOLEAN
-- Define the eligibility rule
GIVEN person IS A Person
GIVETH A BOOLEAN
DECIDE `is eligible` IF
person's age >= 18
AND person's hasValidID
-- Test data
alice MEANS Person "Alice" 25 TRUE
bob MEANS Person "Bob" 16 TRUE
charlie MEANS Person "Charlie" 30 FALSE
-- Tests
#EVAL `is eligible` alice -- Should be TRUE
#EVAL `is eligible` bob -- Should be FALSE (under 18)
#EVAL `is eligible` charlie -- Should be FALSE (no valid ID)
Step 1: Create the File
Create a new file called eligibility.l4:
-- eligibility.l4
-- A simple eligibility check
§ `Eligibility Rule`
-- Define the Person type
DECLARE Person
HAS name IS A STRING
age IS A NUMBER
hasValidID IS A BOOLEAN
-- Define the eligibility rule
GIVEN person IS A Person
GIVETH A BOOLEAN
DECIDE `is eligible` IF
person's age >= 18
AND person's hasValidID
-- Test data
alice MEANS Person "Alice" 25 TRUE
bob MEANS Person "Bob" 16 TRUE
charlie MEANS Person "Charlie" 30 FALSE
-- Tests
#EVAL `is eligible` alice -- Should be TRUE
#EVAL `is eligible` bob -- Should be FALSE (under 18)
#EVAL `is eligible` charlie -- Should be FALSE (no valid ID)
Step 2: Understand the Code
Let's break down each part:
Comments
-- This is a comment
Comments start with -- and are ignored by L4.
Sections
§ `Eligibility Rule`
Sections organize your code. The § symbol starts a section with a title.
Type Declaration
DECLARE Person
HAS name IS A STRING
age IS A NUMBER
hasValidID IS A BOOLEAN
This defines a Person type with three fields: name (text), age (number), and hasValidID (true/false).
Function Definition
GIVEN person IS A Person
GIVETH A BOOLEAN
DECIDE `is eligible` IF
person's age >= 18
AND person's hasValidID
GIVENdeclares the input parameterGIVETH A BOOLEANsays it returns true or falseDECIDE ... IFdefines when the result is true
Test Data
alice MEANS Person "Alice" 25 TRUE
This creates a Person named "Alice" who is 25 years old with valid ID.
Tests
#EVAL `is eligible` alice
#EVAL evaluates an expression and shows the result.
Step 3: Run the File
Option A: VS Code
- Open the file in VS Code (with L4 extension installed)
- Hover over any
#EVALline to see the result - Errors appear as red underlines with explanations
Option B: Command Line
cabal run jl4-cli -- eligibility.l4
This validates the file and reports any errors.
Option C: REPL
cabal run jl4-repl -- eligibility.l4
Then type expressions interactively:
> `is eligible` alice
TRUE
> `is eligible` bob
FALSE
Step 4: Verify the Results
Your tests should show:
| Expression | Result | Why |
|---|---|---|
is eligible alice |
TRUE | Age 25 ≥ 18, has valid ID |
is eligible bob |
FALSE | Age 16 < 18 |
is eligible charlie |
FALSE | No valid ID |
Step 5: Extend the Rule
Let's add another condition: the person must not be banned.
-- Extended Person type
DECLARE Person
HAS name IS A STRING
age IS A NUMBER
hasValidID IS A BOOLEAN
isBanned IS A BOOLEAN
-- Extended rule
GIVEN person IS A Person
GIVETH A BOOLEAN
DECIDE `is eligible` IF
person's age >= 18
AND person's hasValidID
AND NOT person's isBanned
-- Updated test data
alice MEANS Person "Alice" 25 TRUE FALSE
bob MEANS Person "Bob" 16 TRUE FALSE
charlie MEANS Person "Charlie" 30 FALSE FALSE
dave MEANS Person "Dave" 40 TRUE TRUE -- Banned
-- Tests
#EVAL `is eligible` alice -- TRUE
#EVAL `is eligible` bob -- FALSE (under 18)
#EVAL `is eligible` charlie -- FALSE (no valid ID)
#EVAL `is eligible` dave -- FALSE (banned)
Common Mistakes
Missing Indentation
-- ❌ Wrong
DECLARE Person
HAS name IS A STRING
-- ✅ Right
DECLARE Person
HAS name IS A STRING
Missing Apostrophe in Field Access
-- ❌ Wrong
person age >= 18
-- ✅ Right
person's age >= 18
Missing Backticks in Multi-Word Names
-- ❌ Wrong
DECIDE is eligible IF ...
-- ✅ Right
DECIDE `is eligible` IF ...
What You Learned
- How to create an L4 file
- How to define types with
DECLARE - How to define rules with
GIVEN,GIVETH, andDECIDE - How to create test data
- How to test with
#EVAL
Next Steps
- Encoding Legislation - Turn legal text into L4
- Common Patterns - Frequently used L4 patterns
- Foundation Course Module 1 - Learn more about legal rules