309 lines
4.6 KiB
Markdown
309 lines
4.6 KiB
Markdown
# 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!"
|
||
```
|
||
|
||
### 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 fun prefix.
|
||
|
||
```fun
|
||
fun 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
|
||
|
||
### Blocking
|
||
|
||
#### exec(cmd)
|
||
|
||
Executes a command, returns stdout.
|
||
|
||
```fun
|
||
string result = exec("date")
|
||
```
|
||
|
||
#### system(cmd)
|
||
|
||
Executes a command, returns exit code.
|
||
|
||
```fun
|
||
system("ls -l")
|
||
```
|
||
|
||
### Non-Blocking
|
||
|
||
#### nexec(cmd)
|
||
|
||
Executes a command, returns stdout.
|
||
|
||
```fun
|
||
string result = exec("date")
|
||
```
|
||
|
||
#### nspawn(cmd)
|
||
|
||
Executes a command asynchronously, returns process ID.
|
||
|
||
```fun
|
||
number pid = nspawn("sleep 10")
|
||
```
|
||
|
||
#### nsystem(cmd)
|
||
|
||
Executes a command, returns exit code.
|
||
|
||
```fun
|
||
system("ls -l")
|
||
```
|
||
|
||
### Helpers
|
||
|
||
#### wait(pid)
|
||
|
||
Blocks until process finishes, returns exit code.
|
||
|
||
#### read(pid)
|
||
|
||
Returns captured stdout (for processes started with nexec).
|
||
|
||
#### kill(pid)
|
||
|
||
Terminates process.
|
||
|
||
## 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
|
||
fun 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-2.0 License.
|