1
0
Fork 0
forked from fun/fun
fun/spec/v0.1.md

309 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 `az`, `AZ`, `09`, 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.