3.9 KiB
Claro Language Specification
Current package: Claro v1.18.26
Status: Living v1 specification
This document defines the intended behavior of the Claro language. It is written to reduce breaking changes and keep the v1 line teachable and predictable.
1. Design goals
- Easy to learn: readable keywords, minimal punctuation.
- Accessible: consistent rules, simple mental model, clear errors.
- General-purpose scripting: files, JSON/CSV, small tools.
- Safe by default: TRY/CATCH, predictable runtime behavior.
Current scope notes:
- Concurrency is being developed as beginner-safe tasks first; native threads are not exposed as the beginner API.
- Advanced static typing exists as a foundation and is still being expanded.
- Metaprogramming/macros are not a current goal.
2. Source files
- UTF-8 text files.
- LF or CRLF line endings.
- Trailing whitespace is ignored.
- Empty lines are ignored.
3. Comments
3.1 Single-line
# starts a comment to end-of-line.
3.2 Multi-line block
A block comment starts with COMMENT and ends with ENDCOMMENT.
Everything between is ignored.
4. Runtime values (types)
Claro is dynamically typed. A value is one of:
- NONE
- NUMBER (floating point; also used for integers)
- TEXT
- BOOL (
YES/NO) - LIST (ordered; 1-based indexing)
- MAP (dictionary; keys are TEXT)
5. Variables
5.1 Assignment
SET name TO "Alex"
SET n TO 10
5.2 Built-ins
These names are used by the runtime:
- RESULT — value returned by the most recent CALL
- LASTERROR — most recent error message
- LASTERRORFILE — file name for most recent error
- LASTERRORLINE — line number for most recent error
User code can read these. Writing them is allowed but discouraged.
6. Expressions
Expressions can appear in SET/IF/RETURN/etc.
Operators (high → low precedence):
( ... )NOT x* /+ -= != < <= > >=AND OR
Rules:
+concatenates text if either operand is TEXT.- Comparisons return BOOL.
7. Commands (statements)
Keywords are case-insensitive. Each statement is one line beginning with a keyword.
Output
SAY expr
Conditionals
IF cond
...
ELSEIF cond
...
ELSE
...
ENDIF
Loops
Numeric:
FOR i FROM a TO b
...
DONE
Iteration:
FOR EACH item IN listOrMap
...
DONE
Repeat:
REPEAT
...
UNTIL cond
8. Functions
Define:
TEACH name TAKES a, b
...
RETURN expr
LEARNED
Call:
CALL name WITH x, y
After CALL, RESULT contains the returned value (or NONE if no RETURN executed).
9. Errors
Raise:
RAISE "message"
Handle:
TRY
...
CATCH
SAY LASTERROR
ENDTRY
Rules:
- Errors inside TRY jump to CATCH.
- Errors outside TRY terminate the program with non-zero exit code.
- LASTERROR*, including file/line, update on error.
10. Data structures
LIST
1-based indexing:
SET xs TO LIST
ADD 1 TO xs
GET xs AT 1 AS first
MAP
TEXT keys:
SET m TO MAP
PUT m KEY "k" VALUE 1
GET m KEY "k" AS v
11. JSON
Parse:
PARSE JSON text AS value
Make:
MAKE JSON value AS text
MAKE JSON PRETTY value AS text
Parse errors should report a position (character offset) and context snippet.
12. Imports
IMPORT "path/to/module.claro" AS mod
EXPORT ALL
Import resolution order:
- Relative to the importing file’s folder
- Each folder in CLARO_PATH
- Current working directory
13. CLI
claro run file.claro
claro repl
claro fmt file.claro [--inplace]
claro check file.claro
claro test
14. v1 stabilization notes
These details may still be refined within the v1 line:
- exact numeric precision rules
- MAP iteration ordering
- exact wording/format of error messages
- REPL multi-line behaviors
- the boundary between dynamic runtime behavior and optional static checks