# Fun Language Specification v0.1 **Fun (Fun Uses Nothing)** is a lightweight, multi-purpose programming language designed for clarity, safety, and—above all—fun. This document defines the language syntax and semantics as of version 0.1. ## 1. Introduction Fun is a scripting and systems programming language inspired by the best ideas from C, Lua, and Python—yet deliberately strict in its rules to ensure readability and consistency. - **Readable**: fixed indentation rules, no ambiguous syntax. - **Strict**: type safety, no implicit coercion, no silent shadowing. - **Hackable**: strong system integration with safe defaults. - **Fun**: simple enough to learn in a day, expressive enough for real work. ## 2. Lexical Structure ### Case Sensitivity Fun is **case-sensitive**. `Fun` and `fun` are different identifiers. ### Identifiers - May contain `a–z`, `A–Z`, `0–9`, and `_`. - Must not start with a number. ### Keywords Reserved words cannot be redefined: `if`, `else`, `for`, `while`, `fi`, `f`, `global`, `private`, `return`, `true`, `false`. ### Comments - Single-line: ```fun // This is a comment ``` - Multi-line: ```fun /* This is a multi-line comment */ ``` ### Whitespace - Indentation is exactly two spaces. - Tabs are forbidden. - Line breaks terminate statements (no semicolons). ## 3. Data Types ### Number - 64-bit signed integer. ```fun number n = 42 ``` ### Float - 64-bit IEEE floating point. ```fun float pi = 3.14159 ``` ### String - Double or single quotes may be used. - ' has higher priority, so " can appear unescaped inside '...'. - To include ' inside '...', escape with \'. ```fun string s1 = "Hello" string s2 = 'World' string s3 = 'He said: "Fun!"' ``` ### Boolean - Canonical values: true, false. - 1 and 0 are accepted in conditionals. ```fun boolean flag = true ``` ### Byte - Raw byte value. ```fun byte b1 = 0x23 byte b2 = "A" ``` ### Array - Declared using [ ... ]. ```fun array nums = [1, 2, 3] ``` ## 4. Variables and Scope - Global variables: accessible everywhere. - Private variables: file-local, cannot be used outside the file. - Redefining globals or shadowing names is forbidden. ```fun global string message = "Hello" private number count = 42 ``` ## 5. Operators - Arithmetic: + - * / % - Comparison: == != > < >= <= - Boolean: && || ! - Assignment: = ## 6. Control Flow ### If/Else ```fun if(x != y) print x else if(a == b || h != i) print a + b else if(k < 1 && l > 1) print "Buh!" fi fi ``` ### For Loops ```fun for i in range(1, 10) print i ``` ### While Loops ```fun while x < 10 print x x = x + 1 ``` ## 7. Functions ### Internal Functions Provided by the runtime (cannot be redefined). Examples: print, range, system, exec. ```fun print "Hello, Fun!" ``` ### User-Defined Functions Must be declared with the f prefix. ```fun f add(a, b) return a + b ``` ### Return Values - Scalars: return a + b - Arrays: return [a, b, c] ## 8. Modules & Includes ### System Includes Looked up in /var/lib/fun/, supporting .so (native) and .fun (Fun code). ```fun #include crypt/md5 #include date #include math ``` ### Local Includes From the current working directory: ```fun #include utils/file.fun ``` ### Absolute Includes Full path: ```fun #include /home/user/project/lib.fun ``` ## 9. System Integration ### system Executes a command, returns exit code. ```fun system("ls -l") ``` ### exec Executes a command, returns stdout. ```fun string result = exec("date") ``` ### spawn Executes a command asynchronously, returns process ID. ```fun number pid = spawn("sleep 10") ``` ## 10. Error Handling - No implicit type coercion. - Redefinition of globals is a compile-time error. - Using undefined variables or functions is an error. - Internal/runtime functions cannot be shadowed. ## 11. Examples ### Hello World ```fun print "Hello, World!" ``` ### Loop with Range ```fun for i in range(1, 5) print i ``` ### User Function ```fun f greet(name) return "Hello " + name print greet("Fun") ``` ### System Call ```fun string now = exec("date") print "Current time: " + now ``` ## 12. License This document and the Fun language reference are licensed under the Apache License 2.0