name: AILANG Debug description: Debug AILANG code errors. Use when you encounter type errors, parse errors, or runtime failures in AILANG programs.
AILANG Debug
Fix common AILANG errors quickly.
Quick Reference
| Error | Cause | Fix |
|---|---|---|
undefined variable: print | Not in entry module | Use entry module or import std/io (print) |
undefined variable: println | Wrong function name | Use print not println |
undefined variable: map | Not imported | import std/list (map) or write recursive |
No instance for Num[string] | print(42) | Use print(show(42)) |
expected }, got let | Missing semicolon | Add ; between statements |
unexpected token: for | No loops in AILANG | Use recursion instead |
unexpected token: in | No for x in xs | Use match xs { ... } |
Decision Tree
Error message?
│
├─ "undefined variable: X"
│ └─ Is X a builtin?
│ ├─ Yes → Import it: ailang builtins list | grep X
│ └─ No → Check spelling, define it
│
├─ "expected }, got ..."
│ └─ Missing semicolon between statements
│ Fix: let x = 1; let y = 2; x + y
│
├─ "No instance for Num[string]"
│ └─ Passing number to string function
│ Fix: print(show(42)) not print(42)
│
├─ "unexpected token: for/while/in"
│ └─ AILANG has no loops!
│ Fix: Use recursion with match
│
└─ Parse error with braces
└─ Unmatched { } or missing expression
Fix: Check all blocks are closed
Common Fixes
1. Missing Semicolons
-- WRONG
export func main() -> () ! {IO} {
let x = 10
let y = 20
print(show(x + y))
}
-- CORRECT (semicolons between statements)
export func main() -> () ! {IO} {
let x = 10;
let y = 20;
print(show(x + y))
}
2. Print Needs String
-- WRONG: print expects string
print(42)
-- CORRECT: convert with show()
print(show(42))
3. No Loops - Use Recursion
-- WRONG: no for loops
for i in range(5) { print(show(i)) }
-- CORRECT: recursive function
export func printRange(n: int) -> () ! {IO} {
if n <= 0 then () else {
print(show(n));
printRange(n - 1)
}
}
4. Import Standard Library
-- WRONG: map not in scope
let doubled = map(\x. x * 2, nums)
-- CORRECT: import from std/list
import std/list (map)
let doubled = map(\x. x * 2, nums)
-- OR: write it yourself (recursion)
export func myMap[a,b](f: func(a) -> b, xs: [a]) -> [b] {
match xs {
[] => [],
hd :: tl => f(hd) :: myMap(f, tl)
}
}
Debugging Workflow
-
Type-check first (faster feedback):
ailang check file.ail -
Read error location - line:column tells you where
-
Check the pattern above for your error type
-
Use REPL for quick tests:
ailang repl > show(42) > 1 + 2 > :type \x. x * 2 -
List builtins to find imports (CLI is source of truth):
# SOURCE OF TRUTH: Full documentation with examples ailang builtins list --verbose --by-module # Search for specific function with full docs ailang builtins list --verbose | grep -A 10 "map" # See a specific module's functions ailang builtins list --verbose --by-module | grep -A 30 "std/list"
Resources
Always prefer CLI commands (ailang prompt, ailang builtins list --verbose) over static docs - they're always up-to-date.
See resources/error_catalog.md for additional error patterns.