Compare commits
3 Commits
dd1a3468dd
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 37ae3280e8 | |||
| 87bd711079 | |||
| c30eb9b7ad |
@@ -0,0 +1,26 @@
|
|||||||
|
CC = gcc
|
||||||
|
CFLAGS = -Wall -Wextra -O2 -std=c11
|
||||||
|
BINDIR = bin
|
||||||
|
|
||||||
|
TARGET = $(BINDIR)/oraset
|
||||||
|
|
||||||
|
SRCS = src/main.c
|
||||||
|
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
$(TARGET): $(SRCS)
|
||||||
|
@mkdir -p $(BINDIR)
|
||||||
|
$(CC) $(CFLAGS) -o $(TARGET) $(SRCS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(TARGET)
|
||||||
|
rm -rf $(BINDIR)
|
||||||
|
|
||||||
|
pkg: all
|
||||||
|
rm -rf pkg-root
|
||||||
|
mkdir -p pkg-root/usr/local/bin
|
||||||
|
cp bin/oraset pkg-root/usr/local/bin/oraset
|
||||||
|
chmod +x pkg-root/usr/local/bin/oraset
|
||||||
|
pkgbuild --root pkg-root --identifier com.oraset.lang --version B-5 --install-location / Oraset-B5.pkg
|
||||||
|
|
||||||
|
.PHONY: all clean pkg
|
||||||
@@ -1,527 +1,200 @@
|
|||||||
# Oraset 编程语言
|
# Oraset B-5
|
||||||
|
|
||||||
Oraset是一种简单的跨平台编程语言,使用Python实现,支持Windows和Linux系统。
|
A modern, C++-style scripting language designed for ease of use and powerful functionality.
|
||||||
|
|
||||||
## 特性
|
## Features
|
||||||
|
|
||||||
- 跨平台运行(Windows和Linux)
|
### Core Language Features
|
||||||
- 简洁易懂的语法
|
- **Variables**: `let x = 10;`
|
||||||
- 支持变量定义和赋值
|
- **Strings**: `let name = "Hello World";`
|
||||||
- 支持表达式计算(算术、比较、逻辑)
|
- **Arrays**: `let arr = [1, 2, 3, 4, 5];`
|
||||||
- 支持条件语句(if、else if、else)
|
- **Functions**: `proc add(a, b) { return a + b; }`
|
||||||
- 支持循环语句(while)
|
- **Control Flow**: `if`, `else`, `while`, `for`, `switch`, `case`, `default`
|
||||||
- 支持函数定义和调用
|
- **Loops**: `do-while`, `while`, `for`
|
||||||
- 支持类定义
|
|
||||||
- 支持输出功能
|
|
||||||
- 支持注释
|
|
||||||
|
|
||||||
## 快速开始
|
### C++ Style Features
|
||||||
|
- **Structures**: `struct Point { x; y; };`
|
||||||
|
- **Enums**: `enum Color { Red, Green, Blue };`
|
||||||
|
- **Typedef**: `typedef Point Pnt;`
|
||||||
|
- **Pointers**: Support for pointer operations
|
||||||
|
- **goto**: `goto label;`
|
||||||
|
- **Dynamic Memory**: `new`, `delete`, `malloc`
|
||||||
|
- **Exception Handling**: `try`, `catch`, `throw`
|
||||||
|
|
||||||
### 运行环境
|
### Operators
|
||||||
|
- Arithmetic: `+`, `-`, `*`, `/`, `%`
|
||||||
|
- Bitwise: `&`, `|`, `^`, `~`, `<<`, `>>`
|
||||||
|
- Comparison: `==`, `!=`, `<`, `>`, `<=`, `>=`
|
||||||
|
- Logical: `&&`, `||`, `!`
|
||||||
|
- Compound: `+=`, `-=`, `*=`, `/=`, `%=`
|
||||||
|
- Increment/Decrement: `++`, `--`
|
||||||
|
- Ternary: `condition ? true_value : false_value`
|
||||||
|
|
||||||
- Python 3.6+
|
### Built-in Functions
|
||||||
|
- **Mathematical**: `abs`, `sqrt`, `sin`, `cos`, `tan`, `asin`, `acos`, `atan`, `atan2`, `pow`, `log`, `log10`, `exp`, `floor`, `ceil`, `round`
|
||||||
|
- **String**: `strcmp`, `strcpy`, `strcat`, `strlen`, `strchr`, `strstr`, `tolower`, `toupper`, `sizeof`
|
||||||
|
- **Array**: `arrlen`, `memcpy`, `memcmp`, `malloc`, `push`, `pop`, `insert`, `remove`
|
||||||
|
- **File IO**: `fopen`, `fclose`, `fread`, `fwrite`, `fgets`, `fputs`
|
||||||
|
- **System**: `echo`, `input`, `time`, `random`, `exit`, `assert`, `system`, `getenv`, `sleep`
|
||||||
|
|
||||||
### 运行方式
|
## Getting Started
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
- GCC compiler (C11 standard)
|
||||||
|
- Make (optional)
|
||||||
|
|
||||||
|
### Compilation
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 运行.oas或.oraset文件
|
# Windows
|
||||||
python oraset.py <filename.oas|.oraset>
|
gcc -Wall -Wextra -O2 -std=c11 -o bin/oraset src/main.c -lm -lwininet
|
||||||
|
|
||||||
# 将.oas或.oraset文件打包成.osp文件
|
# Linux/Mac
|
||||||
python oraset.py pack <filename.oas|.oraset>
|
gcc -Wall -Wextra -O2 -std=c11 -o bin/oraset src/main.c -lm
|
||||||
|
|
||||||
# 运行.osp文件
|
|
||||||
python oraset.py -osp <filename.osp>
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 示例
|
Or use the Makefile:
|
||||||
|
```bash
|
||||||
|
make
|
||||||
|
```
|
||||||
|
|
||||||
创建一个名为`hello.oas`的文件,内容如下:
|
### Running
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run a script
|
||||||
|
./oraset script.ora
|
||||||
|
|
||||||
|
# REPL mode
|
||||||
|
./oraset
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example Code
|
||||||
|
|
||||||
```oraset
|
```oraset
|
||||||
!! 输出Hello, Oraset!
|
// Hello World
|
||||||
show(`Hello, Oraset!`);
|
echo("Hello, Oraset!");
|
||||||
|
|
||||||
!! 变量定义和计算
|
// Variables and arithmetic
|
||||||
x = 10;
|
let x = 10;
|
||||||
y = 20;
|
let y = 20;
|
||||||
sum = x + y;
|
echo("x + y =", x + y);
|
||||||
show(`10 + 20 = `, sum);
|
|
||||||
|
|
||||||
!! 条件语句
|
// Arrays
|
||||||
if (sum > 25) {
|
let arr = [1, 2, 3];
|
||||||
show(`Sum is greater than 25`);
|
echo("arr[0] =", arr[0]);
|
||||||
} else {
|
echo("array length =", arrlen(arr));
|
||||||
show(`Sum is less than or equal to 25`);
|
|
||||||
}
|
|
||||||
|
|
||||||
!! 循环语句
|
// Functions
|
||||||
i = 0;
|
proc factorial(n) {
|
||||||
while (i < 5) {
|
let result = 1;
|
||||||
show(`i = `, i);
|
for (let i = 1; i <= n; i++) {
|
||||||
i = i + 1;
|
result *= i;
|
||||||
}
|
|
||||||
|
|
||||||
!! 函数定义
|
|
||||||
def add(a, b) {
|
|
||||||
return a + b;
|
|
||||||
}
|
|
||||||
|
|
||||||
!! 函数调用
|
|
||||||
result = add(5, 6);
|
|
||||||
show(`5 + 6 = `, result);
|
|
||||||
|
|
||||||
!! 类定义
|
|
||||||
class Calculator {
|
|
||||||
def multiply(a, b) {
|
|
||||||
return a * b;
|
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
echo("5! =", factorial(5));
|
||||||
|
|
||||||
|
// Structures
|
||||||
|
struct Point {
|
||||||
|
x;
|
||||||
|
y;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Loops
|
||||||
|
let i = 0;
|
||||||
|
while (i < 5) {
|
||||||
|
echo("i =", i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Switch statement
|
||||||
|
let color = 2;
|
||||||
|
switch (color) {
|
||||||
|
case 1: echo("Red"); break;
|
||||||
|
case 2: echo("Green"); break;
|
||||||
|
default: echo("Blue");
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
运行:
|
## Syntax Reference
|
||||||
|
|
||||||
```bash
|
### Variables
|
||||||
python oraset.py hello.oas
|
```oraset
|
||||||
|
let name = value;
|
||||||
```
|
```
|
||||||
|
|
||||||
## 语法指南
|
### Arrays
|
||||||
|
|
||||||
### 注释
|
|
||||||
|
|
||||||
使用`!!`开始单行注释:
|
|
||||||
|
|
||||||
```oraset
|
```oraset
|
||||||
!! 这是一个注释
|
let arr = [1, 2, 3];
|
||||||
|
arr[0] = 10;
|
||||||
|
echo(arr[0]);
|
||||||
```
|
```
|
||||||
|
|
||||||
使用`!*`和`*!`包围多行注释:
|
### Functions
|
||||||
|
|
||||||
```oraset
|
```oraset
|
||||||
!* 这是一个
|
proc func_name(param1, param2) {
|
||||||
多行注释 *!
|
// body
|
||||||
```
|
return value;
|
||||||
|
|
||||||
### 内置库函数
|
|
||||||
|
|
||||||
Oraset提供了以下内置库函数:
|
|
||||||
|
|
||||||
#### 数学函数
|
|
||||||
|
|
||||||
| 函数名 | 描述 | 示例 |
|
|
||||||
|-------|------|------|
|
|
||||||
| `abs(x)` | 返回x的绝对值 | `abs(-10)` → `10` |
|
|
||||||
| `max(x, y)` | 返回x和y中的最大值 | `max(10, 20)` → `20` |
|
|
||||||
| `min(x, y)` | 返回x和y中的最小值 | `min(10, 20)` → `10` |
|
|
||||||
| `pow(x, y)` | 返回x的y次方 | `pow(2, 3)` → `8` |
|
|
||||||
| `sqrt(x)` | 返回x的平方根(取整数部分) | `sqrt(16)` → `4` |
|
|
||||||
|
|
||||||
#### 字符串函数
|
|
||||||
|
|
||||||
| 函数名 | 描述 | 示例 |
|
|
||||||
|-------|------|------|
|
|
||||||
| `len(s)` | 返回字符串s的长度 | `len("Hello")` → `5` |
|
|
||||||
| `upper(s)` | 将字符串s转换为大写 | `upper("Hello")` → `HELLO` |
|
|
||||||
| `lower(s)` | 将字符串s转换为小写 | `lower("HELLO")` → `hello` |
|
|
||||||
| `substring(s, start, end)` | 返回字符串s从start到end的子串 | `substring("Hello", 0, 3)` → `Hel` |
|
|
||||||
| `startsWith(s, prefix)` | 检查字符串s是否以prefix开头 | `startsWith("Hello", "He")` → `1` |
|
|
||||||
| `endsWith(s, suffix)` | 检查字符串s是否以suffix结尾 | `endsWith("Hello", "lo")` → `1` |
|
|
||||||
| `replace(s, old, new)` | 替换字符串s中的old为new | `replace("Hello", "He", "Hi")` → `Hiello` |
|
|
||||||
| `split(s, sep)` | 以sep为分隔符分割字符串s | `split("a,b,c", ",")` → `["a", "b", "c"]` |
|
|
||||||
| `trim(s)` | 去除字符串s首尾的空白 | `trim(" Hello ")` → `Hello` |
|
|
||||||
|
|
||||||
#### 数组函数
|
|
||||||
|
|
||||||
| 函数名 | 描述 | 示例 |
|
|
||||||
|-------|------|------|
|
|
||||||
| `array(...items)` | 创建一个包含指定元素的数组 | `array("a", "b", "c")` → `["a", "b", "c"]` |
|
|
||||||
| `push(arr, item)` | 向数组arr添加一个元素 | `push(["a", "b"], "c")` → `["a", "b", "c"]` |
|
|
||||||
| `pop(arr)` | 从数组arr中移除最后一个元素 | `pop(["a", "b", "c"])` → `["a", "b"]` |
|
|
||||||
| `indexOf(arr, item)` | 返回元素item在数组arr中的索引,若不存在则返回-1 | `indexOf(["a", "b", "c"], "b")` → `1` |
|
|
||||||
|
|
||||||
#### 类型检查函数
|
|
||||||
|
|
||||||
| 函数名 | 描述 | 示例 |
|
|
||||||
|-------|------|------|
|
|
||||||
| `is_number(x)` | 检查x是否为数字 | `is_number("123")` → `1` |
|
|
||||||
| `is_string(x)` | 检查x是否为字符串 | `is_string("Hello")` → `1` |
|
|
||||||
|
|
||||||
#### 其他函数
|
|
||||||
|
|
||||||
| 函数名 | 描述 | 示例 |
|
|
||||||
|-------|------|------|
|
|
||||||
| `input(prompt)` | 从用户输入获取值 | `input("请输入: ")` |
|
|
||||||
| `int(s)` | 将字符串s转换为整数 | `int("123")` → `123` |
|
|
||||||
| `str(x)` | 将x转换为字符串 | `str(123)` → `"123"` |
|
|
||||||
|
|
||||||
#### 文件操作函数
|
|
||||||
|
|
||||||
| 函数名 | 描述 | 示例 |
|
|
||||||
|-------|------|------|
|
|
||||||
| `file_read(filename)` | 读取文件内容 | `file_read("test.txt")` |
|
|
||||||
| `file_write(filename, content)` | 写入内容到文件 | `file_write("test.txt", "Hello")` |
|
|
||||||
| `file_exists(filename)` | 检查文件是否存在 | `file_exists("test.txt")` → `1` (存在) 或 `0` (不存在) |
|
|
||||||
|
|
||||||
#### 时间函数
|
|
||||||
|
|
||||||
| 函数名 | 描述 | 示例 |
|
|
||||||
|-------|------|------|
|
|
||||||
| `time_now()` | 获取当前时间戳 | `time_now()` |
|
|
||||||
| `time_sleep(seconds)` | 暂停指定秒数 | `time_sleep(2)` |
|
|
||||||
|
|
||||||
#### 随机数函数
|
|
||||||
|
|
||||||
| 函数名 | 描述 | 示例 |
|
|
||||||
|-------|------|------|
|
|
||||||
| `random_int(min, max)` | 生成指定范围内的随机整数 | `random_int(1, 100)` |
|
|
||||||
| `random_float()` | 生成0-1之间的随机浮点数 | `random_float()` |
|
|
||||||
|
|
||||||
#### 系统函数
|
|
||||||
|
|
||||||
| 函数名 | 描述 | 示例 |
|
|
||||||
|-------|------|------|
|
|
||||||
| `system(command)` | 执行系统命令 | `system("dir")` |
|
|
||||||
| `get_env(var_name)` | 获取环境变量 | `get_env("PATH")` |
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 数学模块
|
|
||||||
|
|
||||||
**注意:使用数学函数需要先导入math模块**
|
|
||||||
|
|
||||||
```oraset
|
|
||||||
import math
|
|
||||||
```
|
|
||||||
|
|
||||||
| 函数名 | 描述 | 示例 |
|
|
||||||
|-------|------|------|
|
|
||||||
| `abs(x)` | 返回x的绝对值 | `abs(-10)` → `10.0` |
|
|
||||||
| `max(x, y)` | 返回x和y中的最大值 | `max(10, 20)` → `20.0` |
|
|
||||||
| `min(x, y)` | 返回x和y中的最小值 | `min(10, 20)` → `10.0` |
|
|
||||||
| `pow(x, y)` | 返回x的y次方 | `pow(2, 3)` → `8.0` |
|
|
||||||
| `sqrt(x)` | 返回x的平方根 | `sqrt(16)` → `4.0` |
|
|
||||||
| `sin(x)` | 返回x(度)的正弦值 | `sin(90)` → `1.0` |
|
|
||||||
| `cos(x)` | 返回x(度)的余弦值 | `cos(0)` → `1.0` |
|
|
||||||
| `tan(x)` | 返回x(度)的正切值 | `tan(45)` → `1.0` |
|
|
||||||
| `asin(x)` | 返回x的反正弦值(度) | `asin(1)` → `90.0` |
|
|
||||||
| `acos(x)` | 返回x的反余弦值(度) | `acos(1)` → `0.0` |
|
|
||||||
| `atan(x)` | 返回x的反正切值(度) | `atan(1)` → `45.0` |
|
|
||||||
| `pi()` | 返回圆周率π的值 | `pi()` → `3.141592653589793` |
|
|
||||||
| `e()` | 返回自然常数e的值 | `e()` → `2.718281828459045` |
|
|
||||||
|
|
||||||
#### 网络请求函数
|
|
||||||
|
|
||||||
**注意:使用网络请求函数需要先导入http模块**
|
|
||||||
|
|
||||||
```oraset
|
|
||||||
import http
|
|
||||||
```
|
|
||||||
|
|
||||||
| 函数名 | 描述 | 示例 |
|
|
||||||
|-------|------|------|
|
|
||||||
| `http_get(url)` | 发送HTTP GET请求并返回响应内容 | `http_get("http://example.com")` |
|
|
||||||
| `http_post(url, data)` | 发送HTTP POST请求并返回响应内容 | `http_post("http://httpbin.org/post", "{\"name\": \"Oraset\", \"version\": \"1.0\"}")` |
|
|
||||||
|
|
||||||
### 插件系统
|
|
||||||
|
|
||||||
Oraset支持用户自定义插件,您可以将自己的扩展功能放在`includes`文件夹中。
|
|
||||||
|
|
||||||
#### 创建插件
|
|
||||||
|
|
||||||
1. 在`includes`文件夹中创建一个以`.oraset`为后缀的文件
|
|
||||||
2. 在文件中定义函数、类等
|
|
||||||
3. 使用`import 插件名`指令加载插件
|
|
||||||
|
|
||||||
#### 示例
|
|
||||||
|
|
||||||
创建`includes/math_utils.oraset`文件:
|
|
||||||
|
|
||||||
```oraset
|
|
||||||
!! 数学工具插件
|
|
||||||
|
|
||||||
def add(a, b) {
|
|
||||||
return a + b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def subtract(a, b) {
|
func_name(arg1, arg2);
|
||||||
return a - b;
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
在您的代码中使用:
|
### Control Structures
|
||||||
|
|
||||||
```oraset
|
|
||||||
import math_utils
|
|
||||||
|
|
||||||
result = add(10, 20);
|
|
||||||
show(`10 + 20 = `, result);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 变量
|
|
||||||
|
|
||||||
变量定义和赋值:
|
|
||||||
|
|
||||||
```oraset
|
|
||||||
x = 10; // 整数
|
|
||||||
message = `Hello`; // 字符串
|
|
||||||
```
|
|
||||||
|
|
||||||
### 数据类型
|
|
||||||
|
|
||||||
- 整数:`10`, `20`, `30`
|
|
||||||
- 字符串:`` `Hello` ``, `` `World` ``
|
|
||||||
|
|
||||||
字符串支持以下转义符:
|
|
||||||
|
|
||||||
| 转义符 | 描述 |
|
|
||||||
|-------|------|
|
|
||||||
| `\n` | 换行符 |
|
|
||||||
| `\t` | 制表符 |
|
|
||||||
| `\r` | 回车符 |
|
|
||||||
| `\\` | 反斜杠 |
|
|
||||||
| `` \` `` | 反引号 |
|
|
||||||
|
|
||||||
示例:
|
|
||||||
|
|
||||||
```oraset
|
|
||||||
// 输出多行文本
|
|
||||||
show(`Line 1\nLine 2`);
|
|
||||||
|
|
||||||
// 输出带制表符的文本
|
|
||||||
show(`Column 1\tColumn 2`);
|
|
||||||
|
|
||||||
// 输出包含反斜杠的文本
|
|
||||||
show(`Path: C:\\Users\\Name`);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 运算符
|
|
||||||
|
|
||||||
#### 算术运算符
|
|
||||||
|
|
||||||
- `+`:加法
|
|
||||||
- `-`:减法
|
|
||||||
- `*`:乘法
|
|
||||||
- `/`:除法(整数除法)
|
|
||||||
|
|
||||||
#### 比较运算符
|
|
||||||
|
|
||||||
- `==`:等于
|
|
||||||
- `!=`:不等于
|
|
||||||
- `<`:小于
|
|
||||||
- `<=`:小于等于
|
|
||||||
- `>`:大于
|
|
||||||
- `>=`:大于等于
|
|
||||||
|
|
||||||
#### 逻辑运算符
|
|
||||||
|
|
||||||
- `&&`:逻辑与
|
|
||||||
- `||`:逻辑或
|
|
||||||
|
|
||||||
#### 赋值运算符
|
|
||||||
|
|
||||||
- `=`:赋值
|
|
||||||
- `+=`:加赋值
|
|
||||||
- `-=`:减赋值
|
|
||||||
- `*=`:乘赋值
|
|
||||||
- `/=`:除赋值
|
|
||||||
|
|
||||||
### 条件语句
|
|
||||||
|
|
||||||
```oraset
|
```oraset
|
||||||
if (condition) {
|
if (condition) {
|
||||||
// 代码块
|
// code
|
||||||
} else if (condition) {
|
} else if (condition) {
|
||||||
// 代码块
|
// code
|
||||||
} else {
|
} else {
|
||||||
// 代码块
|
// code
|
||||||
}
|
}
|
||||||
```
|
|
||||||
|
|
||||||
### 循环语句
|
|
||||||
|
|
||||||
```oraset
|
|
||||||
while (condition) {
|
while (condition) {
|
||||||
// 代码块
|
// code
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < 10; i++) {
|
||||||
|
// code
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
// code
|
||||||
|
} while (condition);
|
||||||
|
|
||||||
|
switch (value) {
|
||||||
|
case 1: // code; break;
|
||||||
|
case 2: // code; break;
|
||||||
|
default: // code;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 函数定义
|
### Structures and Enums
|
||||||
|
|
||||||
```oraset
|
```oraset
|
||||||
def function_name(parameter1, parameter2, ...) {
|
struct Name {
|
||||||
// 代码块
|
field1;
|
||||||
return value;
|
field2;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
enum Name {
|
||||||
|
Value1,
|
||||||
|
Value2,
|
||||||
|
Value3
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef OriginalType NewTypeName;
|
||||||
```
|
```
|
||||||
|
|
||||||
### 函数调用
|
## Version History
|
||||||
|
|
||||||
```oraset
|
- **B-5**: Current version with C++ style features
|
||||||
result = function_name(arg1, arg2, ...);
|
- **Re+4**: Previous version
|
||||||
```
|
- **Re+3**: Earlier version
|
||||||
|
|
||||||
### 类定义
|
## License
|
||||||
|
|
||||||
```oraset
|
|
||||||
class ClassName {
|
|
||||||
def method_name(parameter1, parameter2, ...) {
|
|
||||||
// 代码块
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 输出
|
|
||||||
|
|
||||||
使用`show`函数输出内容:
|
|
||||||
|
|
||||||
```oraset
|
|
||||||
show(`Hello`);
|
|
||||||
show(`The value is `, x);
|
|
||||||
```
|
|
||||||
|
|
||||||
## 示例代码
|
|
||||||
|
|
||||||
### 基础示例
|
|
||||||
|
|
||||||
```oraset
|
|
||||||
// 变量和表达式
|
|
||||||
x = 10;
|
|
||||||
y = 20;
|
|
||||||
sum = x + y;
|
|
||||||
show(`Sum: `, sum);
|
|
||||||
|
|
||||||
// 条件语句
|
|
||||||
if (sum > 25) {
|
|
||||||
show(`Sum is greater than 25`);
|
|
||||||
} else if (sum == 25) {
|
|
||||||
show(`Sum is exactly 25`);
|
|
||||||
} else {
|
|
||||||
show(`Sum is less than 25`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 循环语句
|
|
||||||
i = 0;
|
|
||||||
while (i < 5) {
|
|
||||||
show(`i = `, i);
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 函数示例
|
|
||||||
|
|
||||||
```oraset
|
|
||||||
// 函数定义
|
|
||||||
def add(a, b) {
|
|
||||||
return a + b;
|
|
||||||
}
|
|
||||||
|
|
||||||
def multiply(a, b) {
|
|
||||||
return a * b;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 函数调用
|
|
||||||
result1 = add(10, 20);
|
|
||||||
result2 = multiply(5, 6);
|
|
||||||
show(`10 + 20 = `, result1);
|
|
||||||
show(`5 * 6 = `, result2);
|
|
||||||
|
|
||||||
// 递归函数
|
|
||||||
def factorial(n) {
|
|
||||||
if (n == 0 || n == 1) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return n * factorial(n - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
result = factorial(5);
|
|
||||||
show(`Factorial of 5 is `, result);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 类示例
|
|
||||||
|
|
||||||
```oraset
|
|
||||||
// 类定义
|
|
||||||
class Calculator {
|
|
||||||
def add(a, b) {
|
|
||||||
return a + b;
|
|
||||||
}
|
|
||||||
|
|
||||||
def subtract(a, b) {
|
|
||||||
return a - b;
|
|
||||||
}
|
|
||||||
|
|
||||||
def multiply(a, b) {
|
|
||||||
return a * b;
|
|
||||||
}
|
|
||||||
|
|
||||||
def divide(a, b) {
|
|
||||||
return a / b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 注意:类方法的调用需要通过函数实现
|
|
||||||
// 目前版本中,类定义会被存储但不会直接实例化
|
|
||||||
```
|
|
||||||
|
|
||||||
## 项目结构
|
|
||||||
|
|
||||||
```
|
|
||||||
Oraset/
|
|
||||||
├── oraset.py # 核心解释器
|
|
||||||
├── examples/ # 示例代码
|
|
||||||
│ ├── hello.oas # 基础示例
|
|
||||||
│ ├── hello.osp # 打包后的基础示例
|
|
||||||
│ ├── functions.oas # 函数示例
|
|
||||||
│ └── classes.oas # 类示例
|
|
||||||
├── README.md # 本教程(中文)
|
|
||||||
└── README.en_us.md # 本教程(英文)
|
|
||||||
```
|
|
||||||
|
|
||||||
## .osp文件说明
|
|
||||||
|
|
||||||
.osp文件是Oraset的打包文件格式,它是通过对.oas文件进行压缩和编码生成的,具有以下特点:
|
|
||||||
|
|
||||||
- **加密性**:.osp文件使用base64编码和zlib压缩,使得源代码不易被直接查看
|
|
||||||
- **跨平台**:.osp文件可以在Windows和Linux系统上直接运行
|
|
||||||
- **便捷性**:.osp文件是一个独立的文件,可以方便地分发和使用
|
|
||||||
|
|
||||||
### 打包.oas文件
|
|
||||||
|
|
||||||
使用`pack`命令将.oas文件打包成.osp文件:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python oraset.py pack <filename.oas>
|
|
||||||
```
|
|
||||||
|
|
||||||
这将生成一个与.oas文件同名但扩展名为.osp的文件。
|
|
||||||
|
|
||||||
### 运行.osp文件
|
|
||||||
|
|
||||||
使用`-osp`参数运行.osp文件:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python oraset.py -osp <filename.osp>
|
|
||||||
```
|
|
||||||
|
|
||||||
这将自动解压和执行.osp文件中的代码。
|
|
||||||
|
|
||||||
## 开发说明
|
|
||||||
|
|
||||||
Oraset使用Python实现,主要包含以下组件:
|
|
||||||
|
|
||||||
- **Lexer**:词法分析器,负责将源代码转换为词法单元
|
|
||||||
- **Parser**:语法分析器,负责构建抽象语法树(AST)
|
|
||||||
- **Interpreter**:解释器,负责执行AST并生成结果
|
|
||||||
|
|
||||||
## 未来计划
|
|
||||||
|
|
||||||
- 支持更多数据类型(浮点数、布尔值等)
|
|
||||||
- 完善类的实例化和方法调用
|
|
||||||
- 支持模块导入
|
|
||||||
- 添加标准库
|
|
||||||
- 优化性能
|
|
||||||
|
|
||||||
## 许可证
|
|
||||||
|
|
||||||
GNU General Public License v3.0
|
GNU General Public License v3.0
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Feel free to fork and contribute!
|
||||||
Binary file not shown.
Binary file not shown.
-102
@@ -1,102 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Oraset Debian Package Builder
|
|
||||||
# This script packages Oraset into a .deb file for Debian/Ubuntu
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
PACKAGE_NAME="oraset"
|
|
||||||
VERSION="1.0.0"
|
|
||||||
ARCH="all"
|
|
||||||
MAINTAINER="Oraset Developer"
|
|
||||||
DESCRIPTION="A simple cross-platform programming language"
|
|
||||||
LICENSE="GPL-3.0"
|
|
||||||
|
|
||||||
# Get the directory where the script is located
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
cd "${SCRIPT_DIR}"
|
|
||||||
|
|
||||||
# Build directory
|
|
||||||
BUILD_DIR="orasetdeb"
|
|
||||||
PACKAGE_DIR="${BUILD_DIR}/${PACKAGE_NAME}_${VERSION}_${ARCH}"
|
|
||||||
|
|
||||||
echo "=== Oraset Debian Package Builder ==="
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Clean previous build
|
|
||||||
echo "[1/6] Cleaning previous build..."
|
|
||||||
rm -rf ${BUILD_DIR}
|
|
||||||
mkdir -p ${PACKAGE_DIR}
|
|
||||||
|
|
||||||
# Install PyInstaller if not present
|
|
||||||
echo "[2/6] Checking PyInstaller..."
|
|
||||||
if ! command -v pyinstaller &> /dev/null; then
|
|
||||||
echo "Installing PyInstaller..."
|
|
||||||
pip install --break-system-packages pyinstaller
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create binary with PyInstaller
|
|
||||||
echo "[3/6] Building binary with PyInstaller..."
|
|
||||||
pyinstaller --onefile --name oraset oraset.py
|
|
||||||
|
|
||||||
# Copy binary to package directory
|
|
||||||
echo "[4/6] Copying files..."
|
|
||||||
mkdir -p ${PACKAGE_DIR}/usr/bin
|
|
||||||
cp dist/oraset ${PACKAGE_DIR}/usr/bin/
|
|
||||||
|
|
||||||
# Create DEBIAN directory and control file
|
|
||||||
echo "[5/6] Creating package metadata..."
|
|
||||||
mkdir -p ${PACKAGE_DIR}/DEBIAN
|
|
||||||
|
|
||||||
cat > ${PACKAGE_DIR}/DEBIAN/control << EOF
|
|
||||||
Package: ${PACKAGE_NAME}
|
|
||||||
Version: ${VERSION}
|
|
||||||
Section: interpreters
|
|
||||||
Priority: optional
|
|
||||||
Architecture: ${ARCH}
|
|
||||||
Depends: python3
|
|
||||||
Maintainer: ${MAINTAINER}
|
|
||||||
Description: ${DESCRIPTION}
|
|
||||||
A simple cross-platform programming language written in Python.
|
|
||||||
Supports Windows and Linux, with features like variables,
|
|
||||||
functions, classes, conditional statements, loops, and more.
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Create copyright file
|
|
||||||
mkdir -p ${PACKAGE_DIR}/usr/share/doc/${PACKAGE_NAME}
|
|
||||||
cat > ${PACKAGE_DIR}/usr/share/doc/${PACKAGE_NAME}/copyright << EOF
|
|
||||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
|
||||||
Upstream-Name: ${PACKAGE_NAME}
|
|
||||||
Upstream-Contact: ${MAINTAINER}
|
|
||||||
Source: https://github.com/oraset/oraset
|
|
||||||
|
|
||||||
Files: *
|
|
||||||
Copyright: ${LICENSE}
|
|
||||||
License: GPL-3.0
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License.
|
|
||||||
.
|
|
||||||
On a Debian system, you can find the complete text of the GPL-3.0
|
|
||||||
license in /usr/share/common-licenses/GPL-3.
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Build the .deb package
|
|
||||||
echo "[6/6] Building .deb package..."
|
|
||||||
dpkg-deb --build ${PACKAGE_DIR}
|
|
||||||
|
|
||||||
# Move package to current directory
|
|
||||||
mv ${PACKAGE_DIR}.deb ${BUILD_DIR}/
|
|
||||||
|
|
||||||
# Clean up PyInstaller build files
|
|
||||||
rm -rf build dist
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "=== Build Complete ==="
|
|
||||||
echo "Package created: ${BUILD_DIR}/${PACKAGE_NAME}_${VERSION}_${ARCH}.deb"
|
|
||||||
echo ""
|
|
||||||
echo "To install the package, run:"
|
|
||||||
echo " sudo dpkg -i ${BUILD_DIR}/${PACKAGE_NAME}_${VERSION}_${ARCH}.deb"
|
|
||||||
echo ""
|
|
||||||
echo "To uninstall the package, run:"
|
|
||||||
echo " sudo dpkg -r ${PACKAGE_NAME}"
|
|
||||||
+2703
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,64 @@
|
|||||||
|
echo("Oraset B-5 扩展功能测试");
|
||||||
|
echo("=========================");
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== 位运算符测试 ===");
|
||||||
|
let a = 5;
|
||||||
|
let b = 3;
|
||||||
|
echo("a & b =", a & b);
|
||||||
|
echo("a | b =", a | b);
|
||||||
|
echo("a ^ b =", a ^ b);
|
||||||
|
let not_a = ~a;
|
||||||
|
echo("~a =", not_a);
|
||||||
|
echo("a << 1 =", a << 1);
|
||||||
|
echo("a >> 1 =", a >> 1);
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== switch语句测试 ===");
|
||||||
|
let x = 2;
|
||||||
|
switch (x) {
|
||||||
|
case 1: echo("x = 1"); break;
|
||||||
|
case 2: echo("x = 2"); break;
|
||||||
|
case 3: echo("x = 3"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== sizeof测试 ===");
|
||||||
|
let s = "Hello World";
|
||||||
|
echo("sizeof(s) =", sizeof(s));
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== while循环测试 ===");
|
||||||
|
let i = 0;
|
||||||
|
while (i < 3) {
|
||||||
|
echo("i =", i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== 内置函数测试 ===");
|
||||||
|
let str1 = "Hello";
|
||||||
|
let str2 = "World";
|
||||||
|
echo("strcmp:", strcmp(str1, str2));
|
||||||
|
echo("strcmp same:", strcmp(str1, str1));
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== continue测试 ===");
|
||||||
|
let j = 0;
|
||||||
|
while (j < 5) {
|
||||||
|
j++;
|
||||||
|
if (j == 3) continue;
|
||||||
|
echo("j =", j);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== break测试 ===");
|
||||||
|
let k = 0;
|
||||||
|
while (k < 5) {
|
||||||
|
if (k == 3) break;
|
||||||
|
echo("k =", k);
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("测试完成!");
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
echo("Oraset B-5 C++风格功能测试");
|
||||||
|
echo("=============================");
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== 结构体测试 ===");
|
||||||
|
struct Point {
|
||||||
|
x;
|
||||||
|
y;
|
||||||
|
};
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== 枚举测试 ===");
|
||||||
|
enum Color {
|
||||||
|
Red,
|
||||||
|
Green,
|
||||||
|
Blue
|
||||||
|
};
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== typedef测试 ===");
|
||||||
|
typedef Point Pnt;
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== goto和标签测试 ===");
|
||||||
|
let n = 0;
|
||||||
|
start:
|
||||||
|
echo("n =", n);
|
||||||
|
n++;
|
||||||
|
if (n < 3) goto start;
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== 数组操作测试 ===");
|
||||||
|
let arr = [10, 20, 30, 40, 50];
|
||||||
|
echo("arr[0] =", arr[0]);
|
||||||
|
echo("arr[1] =", arr[1]);
|
||||||
|
echo("arr[2] =", arr[2]);
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== 数组长度测试 ===");
|
||||||
|
echo("arrlen(arr) =", arrlen(arr));
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("测试完成!");
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
Hello, Oraset!
|
|
||||||
This is a test file.
|
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
proc add(a, b) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = add(5, 3);
|
||||||
|
echo("add(5, 3) =", result);
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Hello World
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
echo("=== 新功能测试 ===");
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== 三元运算符测试 ===");
|
||||||
|
let a = 10;
|
||||||
|
let b = 20;
|
||||||
|
let max = (a > b) ? a : b;
|
||||||
|
echo("max =", max);
|
||||||
|
let min = (a < b) ? a : b;
|
||||||
|
echo("min =", min);
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== 文件IO测试 ===");
|
||||||
|
fopen("test_io.txt", "w");
|
||||||
|
fputs("Hello World\n", __tmp_file_result);
|
||||||
|
fclose(__tmp_file_result);
|
||||||
|
|
||||||
|
fopen("test_io.txt", "r");
|
||||||
|
fgets(__tmp_file_result);
|
||||||
|
echo("读取第一行:", __tmp_str_result);
|
||||||
|
fclose(__tmp_file_result);
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== 字符串函数测试 ===");
|
||||||
|
let s = "Hello World";
|
||||||
|
echo("strlen(s) =", strlen(s));
|
||||||
|
echo("strchr(s, 'W') =", strchr(s, 87));
|
||||||
|
echo("strstr(s, 'World') =", strstr(s, "World"));
|
||||||
|
|
||||||
|
toupper(s);
|
||||||
|
echo("toupper:", __tmp_str_result);
|
||||||
|
|
||||||
|
tolower(__tmp_str_result);
|
||||||
|
echo("tolower:", __tmp_str_result);
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== 数学函数测试 ===");
|
||||||
|
echo("sin(0) =", sin(0));
|
||||||
|
echo("cos(0) =", cos(0));
|
||||||
|
echo("asin(0) =", asin(0));
|
||||||
|
echo("acos(1) =", acos(1));
|
||||||
|
echo("atan(0) =", atan(0));
|
||||||
|
echo("atan2(1, 0) =", atan2(1, 0));
|
||||||
|
echo("log10(100) =", log10(100));
|
||||||
|
echo("exp(1) =", exp(1));
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== 数组操作测试 ===");
|
||||||
|
let arr = [1, 2, 3];
|
||||||
|
echo("初始数组:", arr);
|
||||||
|
|
||||||
|
push(arr, 4);
|
||||||
|
echo("push后:", arr);
|
||||||
|
|
||||||
|
let popped = pop(arr);
|
||||||
|
echo("pop出:", popped);
|
||||||
|
echo("pop后:", arr);
|
||||||
|
|
||||||
|
insert(arr, 1, 99);
|
||||||
|
echo("insert后:", arr);
|
||||||
|
|
||||||
|
let removed = remove(arr, 1);
|
||||||
|
echo("remove出:", removed);
|
||||||
|
echo("remove后:", arr);
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("=== 系统函数测试 ===");
|
||||||
|
getenv("PATH");
|
||||||
|
echo("PATH长度:", strlen(__tmp_str_result));
|
||||||
|
|
||||||
|
echo("");
|
||||||
|
echo("所有新功能测试完成!");
|
||||||
Vendored
BIN
Binary file not shown.
@@ -0,0 +1,174 @@
|
|||||||
|
body {
|
||||||
|
font-family: Georgia, "Times New Roman", serif;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.5;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background: #fff;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layout {
|
||||||
|
display: flex;
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
width: 160px;
|
||||||
|
background: #f4f4f4;
|
||||||
|
border-right: 1px solid #ccc;
|
||||||
|
padding: 10px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
font-family: Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-section {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
background: #e0e0e0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-section-title {
|
||||||
|
background: #c8c8c8;
|
||||||
|
padding: 4px 8px;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 12px;
|
||||||
|
border-bottom: 1px solid #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar ul {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar li {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar a {
|
||||||
|
display: block;
|
||||||
|
padding: 3px 8px;
|
||||||
|
color: #0000ee;
|
||||||
|
text-decoration: underline;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar a:hover {
|
||||||
|
background: #d0d0d0;
|
||||||
|
color: #0000ee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar a.active {
|
||||||
|
background: #b0b0b0;
|
||||||
|
color: #000;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main {
|
||||||
|
flex: 1;
|
||||||
|
padding: 15px 30px;
|
||||||
|
max-width: 1000px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #0000ee;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
color: #0000ee;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
border-bottom: 2px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-top: 25px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
padding-left: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
margin: 3px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border: none;
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
margin: 25px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
background: #f4f4f4;
|
||||||
|
padding: 1px 4px;
|
||||||
|
font-family: "Courier New", monospace;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
background: #f4f4f4;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
padding: 10px;
|
||||||
|
overflow-x: auto;
|
||||||
|
font-family: "Courier New", monospace;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 1.4;
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-list {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-list li {
|
||||||
|
padding: 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-list .version-number {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 20px;
|
||||||
|
margin-bottom: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-list .version-date {
|
||||||
|
color: #666;
|
||||||
|
font-size: 12px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-list .version-desc {
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-list .version-desc ul {
|
||||||
|
padding-left: 20px;
|
||||||
|
margin: 5px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-list .version-desc ul li {
|
||||||
|
padding: 2px 0;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
// 简化版文档列表 API
|
||||||
|
header('Content-Type: application/json; charset=utf-8');
|
||||||
|
|
||||||
|
// 禁用缓存
|
||||||
|
header('Cache-Control: no-cache, no-store, must-revalidate');
|
||||||
|
header('Pragma: no-cache');
|
||||||
|
header('Expires: 0');
|
||||||
|
|
||||||
|
$md_dir = dirname(__FILE__) . '/md';
|
||||||
|
$version_file = dirname(dirname(__FILE__)) . '/download/version.txt';
|
||||||
|
|
||||||
|
// 获取版本号
|
||||||
|
$current_version = '4.0.1-BetaN(+AU)';
|
||||||
|
if (file_exists($version_file)) {
|
||||||
|
$current_version = trim(file_get_contents($version_file));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取所有 md 文件
|
||||||
|
$articles = array();
|
||||||
|
|
||||||
|
if (is_dir($md_dir)) {
|
||||||
|
$files = glob($md_dir . '/*.md');
|
||||||
|
if ($files !== false) {
|
||||||
|
foreach ($files as $file) {
|
||||||
|
$name = basename($file, '.md');
|
||||||
|
$content = @file_get_contents($file);
|
||||||
|
|
||||||
|
$title = $name;
|
||||||
|
if ($content && preg_match('/^# (.+)$/m', $content, $matches)) {
|
||||||
|
$title = $matches[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
$articles[] = array(
|
||||||
|
'name' => $name,
|
||||||
|
'title' => $title,
|
||||||
|
'desc' => ''
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 输出 JSON
|
||||||
|
echo json_encode(array(
|
||||||
|
'version' => $current_version,
|
||||||
|
'articles' => $articles
|
||||||
|
));
|
||||||
|
?>
|
||||||
@@ -0,0 +1,377 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Oraset 文档系统
|
||||||
|
* 自动识别 md 文件夹下的 md 文件并显示
|
||||||
|
* 支持 HTML 和 Markdown 语法
|
||||||
|
*
|
||||||
|
* 使用方式:
|
||||||
|
* index.php - 显示第一个可用文档
|
||||||
|
* index.php?doc=name - 显示指定文档
|
||||||
|
* index.php?list - 列出所有文档
|
||||||
|
* index.php?list-api - 输出 JSON 格式的文档列表
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 配置
|
||||||
|
$md_dir = __DIR__ . '/md';
|
||||||
|
$css_path = '../css/style.css';
|
||||||
|
$version_file = dirname(__DIR__) . '/download/version.txt';
|
||||||
|
|
||||||
|
// 获取版本号
|
||||||
|
function get_version($version_file) {
|
||||||
|
if (file_exists($version_file)) {
|
||||||
|
return trim(file_get_contents($version_file));
|
||||||
|
}
|
||||||
|
return '4.0.1-BetaN(+AU)';
|
||||||
|
}
|
||||||
|
|
||||||
|
$current_version = get_version($version_file);
|
||||||
|
|
||||||
|
// 获取所有 md 文件列表
|
||||||
|
function get_articles_list($md_dir) {
|
||||||
|
$articles = [];
|
||||||
|
$files = glob($md_dir . '/*.md');
|
||||||
|
|
||||||
|
foreach ($files as $file) {
|
||||||
|
$name = basename($file, '.md');
|
||||||
|
$content = file_get_contents($file);
|
||||||
|
|
||||||
|
// 提取标题
|
||||||
|
$title = $name;
|
||||||
|
if (preg_match('/^# (.+)$/m', $content, $matches)) {
|
||||||
|
$title = $matches[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提取描述(第一段非标题、非代码块、非列表的内容)
|
||||||
|
$desc = '';
|
||||||
|
$lines = explode("\n", $content);
|
||||||
|
$in_code = false;
|
||||||
|
foreach ($lines as $line) {
|
||||||
|
$trimmed = trim($line);
|
||||||
|
|
||||||
|
// 跳过代码块
|
||||||
|
if (strpos($trimmed, '```') !== false) {
|
||||||
|
$in_code = !$in_code;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($in_code) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 跳过空行、标题、列表、太短的行
|
||||||
|
if ($trimmed === '' ||
|
||||||
|
preg_match('/^#/', $trimmed) ||
|
||||||
|
preg_match('/^-/', $trimmed) ||
|
||||||
|
strlen($trimmed) < 10) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 找到第一个有效描述,去除Markdown语法
|
||||||
|
$desc = $trimmed;
|
||||||
|
// 去除链接语法
|
||||||
|
$desc = preg_replace('/\[([^\]]+)\]\([^)]+\)/', '$1', $desc);
|
||||||
|
// 去除粗体/斜体
|
||||||
|
$desc = preg_replace('/\*+([^*]+)\*+/', '$1', $desc);
|
||||||
|
// 去除行内代码
|
||||||
|
$desc = preg_replace('/`([^`]+)`/', '$1', $desc);
|
||||||
|
|
||||||
|
if (strlen($desc) > 100) {
|
||||||
|
$desc = substr($desc, 0, 100) . '...';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$articles[] = [
|
||||||
|
'name' => $name,
|
||||||
|
'title' => $title,
|
||||||
|
'desc' => $desc,
|
||||||
|
'file' => $file
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $articles;
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSON API 模式
|
||||||
|
if (isset($_GET['list-api'])) {
|
||||||
|
header('Content-Type: application/json; charset=utf-8');
|
||||||
|
$articles = get_articles_list($md_dir);
|
||||||
|
echo json_encode([
|
||||||
|
'version' => $current_version,
|
||||||
|
'articles' => $articles
|
||||||
|
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Markdown 解析函数(改进版)
|
||||||
|
function parse_markdown($text, $version) {
|
||||||
|
// 替换版本号占位符
|
||||||
|
$text = str_replace('{{VERSION}}', $version, $text);
|
||||||
|
|
||||||
|
// 处理代码块(先处理,避免被其他规则干扰)
|
||||||
|
$text = preg_replace_callback('/```(\w*)\n(.*?)```/s', function($m) {
|
||||||
|
$lang = $m[1] ? ' class="language-' . htmlspecialchars($m[1]) . '"' : '';
|
||||||
|
return '<pre><code' . $lang . '>' . htmlspecialchars($m[2]) . '</code></pre>';
|
||||||
|
}, $text);
|
||||||
|
|
||||||
|
// 处理行内代码
|
||||||
|
$text = preg_replace('/`([^`]+)`/', '<code>$1</code>', $text);
|
||||||
|
|
||||||
|
// 处理标题
|
||||||
|
$text = preg_replace('/^### (.+)$/m', '<h3>$1</h3>', $text);
|
||||||
|
$text = preg_replace('/^## (.+)$/m', '<h2>$1</h2>', $text);
|
||||||
|
$text = preg_replace('/^# (.+)$/m', '<h1>$1</h1>', $text);
|
||||||
|
|
||||||
|
// 处理粗体和斜体
|
||||||
|
$text = preg_replace('/\*\*([^*]+)\*\*/', '<strong>$1</strong>', $text);
|
||||||
|
$text = preg_replace('/\*([^*]+)\*/', '<em>$1</em>', $text);
|
||||||
|
|
||||||
|
// 处理链接(支持 URL 中包含括号)
|
||||||
|
$text = preg_replace_callback('/\[([^\]]+)\]\(\s*([^)]*(?:\([^)]*\)[^)]*)*)\s*\)/', function($m) {
|
||||||
|
$link_text = $m[1];
|
||||||
|
$url = trim($m[2]);
|
||||||
|
return '<a href="' . htmlspecialchars($url, ENT_QUOTES, 'UTF-8') . '">' . $link_text . '</a>';
|
||||||
|
}, $text);
|
||||||
|
|
||||||
|
// 处理分隔线
|
||||||
|
$text = preg_replace('/^---$/m', '<hr>', $text);
|
||||||
|
|
||||||
|
// 处理无序列表
|
||||||
|
$lines = explode("\n", $text);
|
||||||
|
$result = [];
|
||||||
|
$in_list = false;
|
||||||
|
$in_code = false;
|
||||||
|
$in_paragraph = false;
|
||||||
|
|
||||||
|
foreach ($lines as $line) {
|
||||||
|
$trimmed = trim($line);
|
||||||
|
|
||||||
|
// 检查是否在代码块中
|
||||||
|
if (strpos($trimmed, '<pre>') !== false) {
|
||||||
|
$in_code = true;
|
||||||
|
}
|
||||||
|
if (strpos($trimmed, '</pre>') !== false) {
|
||||||
|
$in_code = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($in_code) {
|
||||||
|
$result[] = $line;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理列表项
|
||||||
|
if (preg_match('/^- (.+)$/', $trimmed, $m)) {
|
||||||
|
if (!$in_list) {
|
||||||
|
$result[] = '<ul>';
|
||||||
|
$in_list = true;
|
||||||
|
}
|
||||||
|
$result[] = '<li>' . $m[1] . '</li>';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 结束列表
|
||||||
|
if ($in_list && !preg_match('/^-/', $trimmed)) {
|
||||||
|
$result[] = '</ul>';
|
||||||
|
$in_list = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理块元素(标题、hr、pre等)
|
||||||
|
if (preg_match('/^<(h[1-6]|hr|pre|ul|li)/', $trimmed) || $trimmed === '') {
|
||||||
|
if ($in_paragraph) {
|
||||||
|
$result[] = '</p>';
|
||||||
|
$in_paragraph = false;
|
||||||
|
}
|
||||||
|
$result[] = $line;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理段落
|
||||||
|
if (!$in_paragraph && $trimmed !== '') {
|
||||||
|
$result[] = '<p>' . $trimmed;
|
||||||
|
$in_paragraph = true;
|
||||||
|
} else if ($in_paragraph && $trimmed !== '') {
|
||||||
|
$result[] = $trimmed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 结束未闭合的标签
|
||||||
|
if ($in_list) {
|
||||||
|
$result[] = '</ul>';
|
||||||
|
}
|
||||||
|
if ($in_paragraph) {
|
||||||
|
$result[] = '</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode("\n", $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取文章列表
|
||||||
|
$articles = get_articles_list($md_dir);
|
||||||
|
|
||||||
|
// 判断是否显示列表模式
|
||||||
|
$show_list = isset($_GET['list']);
|
||||||
|
|
||||||
|
// 获取请求的文档
|
||||||
|
$doc = isset($_GET['doc']) ? $_GET['doc'] : '';
|
||||||
|
|
||||||
|
// 安全处理:只允许字母、数字、下划线、连字符
|
||||||
|
$doc = preg_replace('/[^a-zA-Z0-9_-]/', '', $doc);
|
||||||
|
|
||||||
|
// 文件路径
|
||||||
|
$file_path = '';
|
||||||
|
if ($doc !== '') {
|
||||||
|
$file_path = $md_dir . '/' . $doc . '.md';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果文件不存在,显示第一个可用文档
|
||||||
|
if ($file_path === '' || !file_exists($file_path)) {
|
||||||
|
if (count($articles) > 0) {
|
||||||
|
$file_path = $articles[0]['file'];
|
||||||
|
$doc = $articles[0]['name'];
|
||||||
|
} else {
|
||||||
|
// 没有文档时显示默认页面
|
||||||
|
$html_content = '<h1>Oraset 文档</h1><p>暂无文档。</p>';
|
||||||
|
$title = 'Oraset 文档';
|
||||||
|
$doc = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读取文档内容
|
||||||
|
if ($file_path !== '' && file_exists($file_path)) {
|
||||||
|
$content = file_get_contents($file_path);
|
||||||
|
|
||||||
|
// 先执行 PHP 代码
|
||||||
|
ob_start();
|
||||||
|
eval('?>' . $content . '<?php ');
|
||||||
|
$content = ob_get_clean();
|
||||||
|
|
||||||
|
// 替换版本号占位符 {{VERSION}}
|
||||||
|
$content = str_replace('{{VERSION}}', $current_version, $content);
|
||||||
|
|
||||||
|
$html_content = parse_markdown($content, $current_version);
|
||||||
|
|
||||||
|
// 提取当前文档标题
|
||||||
|
$title = 'Oraset 文档';
|
||||||
|
if (preg_match('/^# (.+)$/m', $content, $matches)) {
|
||||||
|
$title = $matches[1] . ' - Oraset';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果是列表模式,生成列表 HTML
|
||||||
|
if ($show_list) {
|
||||||
|
$title = '文档列表 - Oraset';
|
||||||
|
$list_html = "<h1>文档列表</h1>\n<p>以下是所有可用的文档:</p>\n<ul class=\"doc-list\">";
|
||||||
|
foreach ($articles as $art) {
|
||||||
|
$list_html .= '<li>';
|
||||||
|
$list_html .= '<a href="?doc=' . htmlspecialchars($art['name']) . '">' . htmlspecialchars($art['title']) . '</a>';
|
||||||
|
if ($art['desc']) {
|
||||||
|
$list_html .= '<br><span class="doc-desc">' . htmlspecialchars($art['desc']) . '</span>';
|
||||||
|
}
|
||||||
|
$list_html .= '</li>';
|
||||||
|
}
|
||||||
|
$list_html .= '</ul>';
|
||||||
|
$html_content = $list_html;
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title><?php echo htmlspecialchars($title); ?></title>
|
||||||
|
<link rel="stylesheet" href="<?php echo $css_path; ?>">
|
||||||
|
<style>
|
||||||
|
/* 文档系统额外样式 */
|
||||||
|
.doc-list {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.doc-list li {
|
||||||
|
padding: 12px 0;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
.doc-list a {
|
||||||
|
font-size: 16px;
|
||||||
|
color: #0000ee;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
.doc-desc {
|
||||||
|
color: #666;
|
||||||
|
font-size: 13px;
|
||||||
|
margin-top: 4px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.sidebar-loading {
|
||||||
|
color: #999;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="layout">
|
||||||
|
<nav class="sidebar">
|
||||||
|
<div class="sidebar-section">
|
||||||
|
<div class="sidebar-section-title">Oraset</div>
|
||||||
|
<ul>
|
||||||
|
<li><a href="../index.php">首页</a></li>
|
||||||
|
<li><a href="../download.php">下载</a></li>
|
||||||
|
<li><a href="../releases.php">历史版本</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="sidebar-section">
|
||||||
|
<div class="sidebar-section-title">文档</div>
|
||||||
|
<ul>
|
||||||
|
<li><a href="?list" id="nav-list"<?php echo $show_list ? ' class="active"' : ''; ?>>文档列表</a></li>
|
||||||
|
</ul>
|
||||||
|
<ul id="doc-nav-list">
|
||||||
|
<li><span class="sidebar-loading">加载中...</span></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main class="main">
|
||||||
|
<?php echo $html_content; ?>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 获取当前文档名
|
||||||
|
var currentDoc = '<?php echo htmlspecialchars($doc); ?>';
|
||||||
|
var showList = <?php echo $show_list ? 'true' : 'false'; ?>;
|
||||||
|
|
||||||
|
// 加载文档列表
|
||||||
|
fetch('./api.php')
|
||||||
|
.then(function(response) {
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Network response was not ok');
|
||||||
|
}
|
||||||
|
return response.json();
|
||||||
|
})
|
||||||
|
.then(function(data) {
|
||||||
|
var navList = document.getElementById('doc-nav-list');
|
||||||
|
navList.innerHTML = '';
|
||||||
|
|
||||||
|
if (data.articles && data.articles.length > 0) {
|
||||||
|
data.articles.forEach(function(article) {
|
||||||
|
var li = document.createElement('li');
|
||||||
|
var a = document.createElement('a');
|
||||||
|
a.href = './?doc=' + article.name;
|
||||||
|
a.textContent = article.title;
|
||||||
|
|
||||||
|
if (!showList && article.name === currentDoc) {
|
||||||
|
a.className = 'active';
|
||||||
|
}
|
||||||
|
|
||||||
|
li.appendChild(a);
|
||||||
|
navList.appendChild(li);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
navList.innerHTML = '<li><span class="sidebar-loading">暂无文档</span></li>';
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(function(error) {
|
||||||
|
console.error('Error loading document list:', error);
|
||||||
|
document.getElementById('doc-nav-list').innerHTML = '<li><span class="sidebar-loading">加载失败</span></li>';
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
# 入门指南
|
||||||
|
|
||||||
|
本指南将帮助您快速安装和配置 Oraset 编程语言 B-5 版本环境,并运行您的第一个程序。
|
||||||
|
|
||||||
|
## 安装 Oraset
|
||||||
|
|
||||||
|
### macOS
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl https://oraset.parlz.com/download/sh/install.sh | bash
|
||||||
|
```
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl https://oraset.parlz.com/download/sh/install-linux.sh | bash
|
||||||
|
```
|
||||||
|
|
||||||
|
或手动下载 <a href="https://oraset.parlz.com/download/deb/Oraset-B5.deb" download="oraset.deb" >oraset.deb</a>,然后运行:
|
||||||
|
```bash
|
||||||
|
sudo dpkg -i oraset.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
下载 <a href="https://oraset.parlz.com/download/exe/Oraset-B5.exe" download="oraset.exe" >oraset.exe</a> 并添加到系统 PATH。
|
||||||
|
|
||||||
|
## 验证安装
|
||||||
|
|
||||||
|
```bash
|
||||||
|
oraset -v
|
||||||
|
```
|
||||||
|
|
||||||
|
应该显示:"B-5"
|
||||||
|
|
||||||
|
## 运行第一个程序
|
||||||
|
|
||||||
|
### 步骤 1:创建脚本文件
|
||||||
|
|
||||||
|
创建一个名为 `hello.ora` 的文件,内容如下:
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
print("Hello, World!");
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 2:运行脚本
|
||||||
|
|
||||||
|
```bash
|
||||||
|
oraset hello.ora
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
Hello, World!
|
||||||
|
```
|
||||||
|
|
||||||
|
## 交互模式
|
||||||
|
|
||||||
|
Oraset B-5 支持 REPL 交互模式:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
oraset -i
|
||||||
|
```
|
||||||
|
|
||||||
|
或
|
||||||
|
|
||||||
|
```bash
|
||||||
|
oraset --interactive
|
||||||
|
```
|
||||||
|
|
||||||
|
进入交互模式后,您可以直接输入代码并立即看到结果:
|
||||||
|
|
||||||
|
```
|
||||||
|
Oraset B-5 REPL
|
||||||
|
Type 'exit' or 'quit' to exit.
|
||||||
|
> var x = 10
|
||||||
|
> print(x)
|
||||||
|
10
|
||||||
|
> exit
|
||||||
|
```
|
||||||
|
|
||||||
|
## 常见问题
|
||||||
|
|
||||||
|
### Q: 命令找不到?
|
||||||
|
|
||||||
|
A: 确保 oraset 已添加到系统 PATH,并重新打开终端。
|
||||||
|
|
||||||
|
### Q: 如何退出交互模式?
|
||||||
|
|
||||||
|
A: 输入 `exit` 或 `quit` 即可退出。
|
||||||
|
|
||||||
|
### Q: 脚本执行完成后自动退出?
|
||||||
|
|
||||||
|
A: 是的,脚本执行完成后自动退出,无需手动操作。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Oraset Project © 2026
|
||||||
@@ -0,0 +1,212 @@
|
|||||||
|
# 语言参考
|
||||||
|
|
||||||
|
Oraset 编程语言 B-5 版本的完整语法参考文档,包含变量、数据类型、运算符和控制流等核心特性。
|
||||||
|
|
||||||
|
## 变量
|
||||||
|
|
||||||
|
### 声明变量
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
var x = 10;
|
||||||
|
var name = "test";
|
||||||
|
var pi = 3.14;
|
||||||
|
var flag;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 修改变量
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
x = 20;
|
||||||
|
name = "new name";
|
||||||
|
```
|
||||||
|
|
||||||
|
### 复合赋值
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
x += 5;
|
||||||
|
x -= 3;
|
||||||
|
x *= 2;
|
||||||
|
x /= 2;
|
||||||
|
x %= 3;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 自增自减
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
x++;
|
||||||
|
x--;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 数据类型
|
||||||
|
|
||||||
|
- **数字**:整数和浮点数,如 `42`、`3.14`
|
||||||
|
- **字符串**:用双引号或单引号包围,如 `"Hello"`、`'World'`
|
||||||
|
- **数组**:用方括号定义,如 `[1, 2, 3]`
|
||||||
|
|
||||||
|
## 数组
|
||||||
|
|
||||||
|
### 创建数组
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
var arr = [10, 20, 30, 40, 50];
|
||||||
|
var empty = array(5);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 访问数组元素
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
print(arr[0]);
|
||||||
|
arr[2] = 35;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 数组长度
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
var len = arrlen(arr);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 运算符
|
||||||
|
|
||||||
|
### 算术运算符
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
+ // 加法
|
||||||
|
- // 减法
|
||||||
|
* // 乘法
|
||||||
|
/ // 除法
|
||||||
|
% // 取模
|
||||||
|
```
|
||||||
|
|
||||||
|
### 比较运算符
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
== // 等于
|
||||||
|
!= // 不等于
|
||||||
|
> // 大于
|
||||||
|
< // 小于
|
||||||
|
>= // 大于等于
|
||||||
|
<= // 小于等于
|
||||||
|
```
|
||||||
|
|
||||||
|
### 逻辑运算符
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
&& // 逻辑与
|
||||||
|
|| // 逻辑或
|
||||||
|
! // 逻辑非
|
||||||
|
```
|
||||||
|
|
||||||
|
## 输出
|
||||||
|
|
||||||
|
### print 函数
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
print("Hello"); // 输出并换行
|
||||||
|
print("No newline", "nel"); // 输出不换行
|
||||||
|
print("A", "B", 123); // 多个参数用空格分隔
|
||||||
|
print(arr); // 打印数组
|
||||||
|
```
|
||||||
|
|
||||||
|
## 控制流
|
||||||
|
|
||||||
|
### 条件语句
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
if (x > 10) {
|
||||||
|
print("x is big");
|
||||||
|
} else {
|
||||||
|
print("x is small");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 循环语句
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
while (x < 100) {
|
||||||
|
print(x);
|
||||||
|
x++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < 10; i++) {
|
||||||
|
print(i);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 函数定义
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
function add(a, b) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
|
||||||
|
add(5, 3);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 内置函数
|
||||||
|
|
||||||
|
### 数学函数
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
abs(x) // 绝对值
|
||||||
|
sqrt(x) // 平方根
|
||||||
|
sin(x) // 正弦
|
||||||
|
cos(x) // 余弦
|
||||||
|
tan(x) // 正切
|
||||||
|
pow(x, y) // x的y次方
|
||||||
|
log(x) // 自然对数
|
||||||
|
floor(x) // 向下取整
|
||||||
|
ceil(x) // 向上取整
|
||||||
|
round(x) // 四舍五入
|
||||||
|
int(x) // 转为整数
|
||||||
|
float(x) // 转为浮点数
|
||||||
|
rand() // 0-1随机数
|
||||||
|
rand(n) // 0-n随机数
|
||||||
|
time() // 当前时间戳
|
||||||
|
```
|
||||||
|
|
||||||
|
### 字符串函数
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
len(str) // 字符串长度
|
||||||
|
num(str) // 字符串转数字
|
||||||
|
str(num) // 数字转字符串
|
||||||
|
```
|
||||||
|
|
||||||
|
### 数组函数
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
array(size) // 创建指定大小的数组
|
||||||
|
arrlen(arr) // 获取数组长度
|
||||||
|
```
|
||||||
|
|
||||||
|
### 输入函数
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
input() // 读取用户输入
|
||||||
|
input("提示:") // 带提示的输入
|
||||||
|
```
|
||||||
|
|
||||||
|
## 文件配置
|
||||||
|
|
||||||
|
### sg 语法
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
sg<nel>
|
||||||
|
print("All lines no newline");
|
||||||
|
print("Still same line");
|
||||||
|
```
|
||||||
|
|
||||||
|
`sg<nel>` 设置整个文件的 print 默认不换行。
|
||||||
|
|
||||||
|
## 注释
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
# 单行注释
|
||||||
|
// 单行注释
|
||||||
|
/* 多行
|
||||||
|
注释 */
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Oraset Project © 2026
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
# 贪吃蛇游戏
|
||||||
|
|
||||||
|
这是一个用 Oraset B-5 编写的控制台贪吃蛇游戏!
|
||||||
|
|
||||||
|
## 游戏说明
|
||||||
|
|
||||||
|
使用方向键控制蛇的移动方向,吃食物得分。
|
||||||
|
|
||||||
|
## 运行方法
|
||||||
|
|
||||||
|
```bash
|
||||||
|
oraset examples/snake.ora
|
||||||
|
```
|
||||||
|
|
||||||
|
## 代码
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
// snake.ora - 贪吃蛇游戏
|
||||||
|
// 使用 w/a/s/d 或方向键控制
|
||||||
|
// Oraset B-5 版本 - 使用数组存储蛇的位置
|
||||||
|
|
||||||
|
var width = 40;
|
||||||
|
var height = 20;
|
||||||
|
var speed = 150;
|
||||||
|
var game_over = 0;
|
||||||
|
var score = 0;
|
||||||
|
|
||||||
|
var snake_x = [10, 9, 8];
|
||||||
|
var snake_y = [10, 10, 10];
|
||||||
|
var snake_len = 3;
|
||||||
|
|
||||||
|
var food_x = 25;
|
||||||
|
var food_y = 10;
|
||||||
|
|
||||||
|
var direction = 1;
|
||||||
|
var next_direction = 1;
|
||||||
|
|
||||||
|
function generate_food() {
|
||||||
|
food_x = int(rand() * (width - 4)) + 2;
|
||||||
|
food_y = int(rand() * (height - 4)) + 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
generate_food();
|
||||||
|
|
||||||
|
while (game_over == 0) {
|
||||||
|
direction = next_direction;
|
||||||
|
|
||||||
|
var new_head_x = snake_x[0];
|
||||||
|
var new_head_y = snake_y[0];
|
||||||
|
|
||||||
|
if (direction == 0) new_head_y--;
|
||||||
|
if (direction == 1) new_head_x++;
|
||||||
|
if (direction == 2) new_head_y++;
|
||||||
|
if (direction == 3) new_head_x--;
|
||||||
|
|
||||||
|
if (new_head_x <= 0 || new_head_x >= width - 1 ||
|
||||||
|
new_head_y <= 0 || new_head_y >= height - 1) {
|
||||||
|
game_over = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
while (i < snake_len) {
|
||||||
|
if (new_head_x == snake_x[i] && new_head_y == snake_y[i]) {
|
||||||
|
game_over = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (game_over == 1) break;
|
||||||
|
|
||||||
|
if (new_head_x == food_x && new_head_y == food_y) {
|
||||||
|
score++;
|
||||||
|
snake_len++;
|
||||||
|
generate_food();
|
||||||
|
}
|
||||||
|
|
||||||
|
i = snake_len - 1;
|
||||||
|
while (i > 0) {
|
||||||
|
snake_x[i] = snake_x[i - 1];
|
||||||
|
snake_y[i] = snake_y[i - 1];
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
|
||||||
|
snake_x[0] = new_head_x;
|
||||||
|
snake_y[0] = new_head_y;
|
||||||
|
|
||||||
|
var y = 0;
|
||||||
|
while (y < height) {
|
||||||
|
var x = 0;
|
||||||
|
while (x < width) {
|
||||||
|
var is_snake = 0;
|
||||||
|
var is_food = 0;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (i < snake_len) {
|
||||||
|
if (x == snake_x[i] && y == snake_y[i]) {
|
||||||
|
is_snake = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x == food_x && y == food_y) {
|
||||||
|
is_food = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_snake == 1) {
|
||||||
|
print("O", "nel");
|
||||||
|
} else if (is_food == 1) {
|
||||||
|
print("*", "nel");
|
||||||
|
} else if (x == 0 || x == width - 1 || y == 0 || y == height - 1) {
|
||||||
|
print("-", "nel");
|
||||||
|
} else {
|
||||||
|
print(" ", "nel");
|
||||||
|
}
|
||||||
|
x++;
|
||||||
|
}
|
||||||
|
print("");
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
|
||||||
|
print("分数:", score, " | 长度:", snake_len);
|
||||||
|
print("w=上 a=左 s=下 d=右");
|
||||||
|
}
|
||||||
|
|
||||||
|
print("游戏结束! 最终分数:", score);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
这个版本使用了 Oraset B-5 的数组功能,代码更加简洁高效。
|
||||||
|
蛇的身体现在存储在数组中,可以无限增长。
|
||||||
@@ -0,0 +1,220 @@
|
|||||||
|
# 教程
|
||||||
|
|
||||||
|
通过实际示例学习 Oraset 编程语言 B-5 版本,从基础输出到循环和条件判断。
|
||||||
|
|
||||||
|
## 示例 1:基本输出
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
// hello.ora
|
||||||
|
print("Welcome to Oraset B-5!");
|
||||||
|
print("This is my first program.");
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
Welcome to Oraset B-5!
|
||||||
|
This is my first program.
|
||||||
|
```
|
||||||
|
|
||||||
|
## 示例 2:变量和计算
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
// calc.ora
|
||||||
|
var a = 10;
|
||||||
|
var b = 20;
|
||||||
|
var sum = a + b;
|
||||||
|
print("The sum is:", sum);
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
The sum is: 30
|
||||||
|
```
|
||||||
|
|
||||||
|
## 示例 3:条件判断
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
// grade.ora
|
||||||
|
var score = 85;
|
||||||
|
if (score >= 60) {
|
||||||
|
print("Pass!");
|
||||||
|
} else {
|
||||||
|
print("Fail!");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
Pass!
|
||||||
|
```
|
||||||
|
|
||||||
|
## 示例 4:循环
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
// loop.ora
|
||||||
|
var i = 1;
|
||||||
|
while (i <= 5) {
|
||||||
|
print("Count:", i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
Count: 1
|
||||||
|
Count: 2
|
||||||
|
Count: 3
|
||||||
|
Count: 4
|
||||||
|
Count: 5
|
||||||
|
```
|
||||||
|
|
||||||
|
## 示例 5:不换行输出
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
// inline.ora
|
||||||
|
print("Loading", "nel");
|
||||||
|
print(".");
|
||||||
|
print(".");
|
||||||
|
print(" Done!");
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
Loading...
|
||||||
|
Done!
|
||||||
|
```
|
||||||
|
|
||||||
|
## 示例 6:文件级配置
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
// no_newline.ora
|
||||||
|
sg<nel>
|
||||||
|
print("All");
|
||||||
|
print("on");
|
||||||
|
print("same");
|
||||||
|
print("line");
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
Allonsameline
|
||||||
|
```
|
||||||
|
|
||||||
|
## 示例 7:数组
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
// array.ora
|
||||||
|
var arr = [10, 20, 30, 40, 50];
|
||||||
|
print("Array:", arr);
|
||||||
|
print("First element:", arr[0]);
|
||||||
|
print("Array length:", arrlen(arr));
|
||||||
|
|
||||||
|
arr[2] = 35;
|
||||||
|
print("Modified array:", arr);
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
Array: [10, 20, 30, 40, 50]
|
||||||
|
First element: 10
|
||||||
|
Array length: 5
|
||||||
|
Modified array: [10, 20, 35, 40, 50]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 示例 8:复合赋值
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
// compound.ora
|
||||||
|
var x = 10;
|
||||||
|
x += 5;
|
||||||
|
print("x += 5:", x);
|
||||||
|
x *= 2;
|
||||||
|
print("x *= 2:", x);
|
||||||
|
x -= 3;
|
||||||
|
print("x -= 3:", x);
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
x += 5: 15
|
||||||
|
x *= 2: 30
|
||||||
|
x -= 3: 27
|
||||||
|
```
|
||||||
|
|
||||||
|
## 示例 9:函数
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
// function.ora
|
||||||
|
function add(a, b) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
|
||||||
|
function multiply(a, b) {
|
||||||
|
return a * b;
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = add(5, 3);
|
||||||
|
print("5 + 3 =", result);
|
||||||
|
|
||||||
|
result = multiply(4, 6);
|
||||||
|
print("4 * 6 =", result);
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
5 + 3 = 8
|
||||||
|
4 * 6 = 24
|
||||||
|
```
|
||||||
|
|
||||||
|
## 示例 10:数学函数
|
||||||
|
|
||||||
|
```oraset
|
||||||
|
// math.ora
|
||||||
|
var pi = 3.14159;
|
||||||
|
print("sin(pi/2) =", sin(pi/2));
|
||||||
|
print("sqrt(16) =", sqrt(16));
|
||||||
|
print("abs(-42) =", abs(-42));
|
||||||
|
print("pow(2, 8) =", pow(2, 8));
|
||||||
|
print("rand() =", rand());
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
sin(pi/2) = 1
|
||||||
|
sqrt(16) = 4
|
||||||
|
abs(-42) = 42
|
||||||
|
pow(2, 8) = 256
|
||||||
|
rand() = 0.123456
|
||||||
|
```
|
||||||
|
|
||||||
|
## 练习题
|
||||||
|
|
||||||
|
### 练习 1
|
||||||
|
|
||||||
|
编写一个程序,计算 1 到 10 的和。
|
||||||
|
|
||||||
|
### 练习 2
|
||||||
|
|
||||||
|
编写一个程序,判断一个数是奇数还是偶数。
|
||||||
|
|
||||||
|
### 练习 3
|
||||||
|
|
||||||
|
编写一个程序,输出 99 乘法表的一行。
|
||||||
|
|
||||||
|
### 练习 4
|
||||||
|
|
||||||
|
编写一个程序,使用数组存储 5 个数字,然后计算它们的平均值。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Oraset Project © 2026
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>下载 Oraset</title>
|
||||||
|
<link rel="stylesheet" href="css/style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="layout">
|
||||||
|
<nav class="sidebar">
|
||||||
|
<div class="sidebar-section">
|
||||||
|
<div class="sidebar-section-title">Oraset</div>
|
||||||
|
<ul>
|
||||||
|
<li><a href="index.php">首页</a></li>
|
||||||
|
<li><a href="download.php" class="active">下载</a></li>
|
||||||
|
<li><a href="releases.php">历史版本</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="sidebar-section">
|
||||||
|
<div class="sidebar-section-title">文档</div>
|
||||||
|
<ul>
|
||||||
|
<li><a href="docs/index.php?list">文档列表</a></li>
|
||||||
|
</ul>
|
||||||
|
<ul id="doc-nav-list">
|
||||||
|
<li><span class="sidebar-loading">加载中...</span></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main class="main">
|
||||||
|
<h1>下载</h1>
|
||||||
|
|
||||||
|
<h2>最新版本:B-5</h2>
|
||||||
|
<p class="version-note">构建日期: 2026.7.22 | 全新升级版本</p>
|
||||||
|
|
||||||
|
<h2>Windows <span class="version-badge">B-5</span></h2>
|
||||||
|
<p><strong>EXE 可执行文件</strong></p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="download/exe/Oraset-B-5.exe">Oraset-B-5.exe</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>macOS <span class="version-badge">B-5</span></h2>
|
||||||
|
<p><strong>PKG 安装包</strong></p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="download/pkg/Oraset-B5.pkg">Oraset-B5.pkg</a></li>
|
||||||
|
</ul>
|
||||||
|
<pre>wget https://oraset.parlz.com/download/pkg/Oraset-B5.pkg
|
||||||
|
sudo installer -pkg Oraset-B5.pkg -target /</pre>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>历史版本</h2>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Re+4.0.1-BetaN(+AU)</strong> - 2026.6.12 新增自动更新功能
|
||||||
|
<br><a href="download/source/Oraset-Re+4.0.1-BetaN(+AU)-source.tar.gz">源码下载</a>
|
||||||
|
</li>
|
||||||
|
<li><strong>Re+4.0.1-Beta</strong> - 2026.6.12 测试版本
|
||||||
|
<br><a href="download/source/Oraset-Re+4.0.1-Beta(..26:.6:12)-source.tar.gz">源码下载</a>
|
||||||
|
</li>
|
||||||
|
<li><strong>Re+4.0.0-Release</strong> - 2026年早期稳定版本
|
||||||
|
<br><a href="download/source/Oraset-Re+4.0.0-Release-source.tar.gz">源码下载</a>
|
||||||
|
</li>
|
||||||
|
<li><strong>Re+4.0.0-Beta</strong> - 2026年早期测试版本
|
||||||
|
<br><a href="download/source/Oraset-Re+4.0.0-Beta-source.tar.gz">源码下载</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>系统要求</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Windows 10/11 (64位)</li>
|
||||||
|
<li>macOS 10.15+</li>
|
||||||
|
<li>Linux x86_64</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<p>Oraset Project © 2026</p>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
fetch('docs/api.php')
|
||||||
|
.then(function(response) {
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Network response was not ok');
|
||||||
|
}
|
||||||
|
return response.json();
|
||||||
|
})
|
||||||
|
.then(function(data) {
|
||||||
|
var navList = document.getElementById('doc-nav-list');
|
||||||
|
navList.innerHTML = '';
|
||||||
|
if (data.articles && data.articles.length > 0) {
|
||||||
|
data.articles.forEach(function(article) {
|
||||||
|
var li = document.createElement('li');
|
||||||
|
var a = document.createElement('a');
|
||||||
|
a.href = 'docs/index.php?doc=' + article.name;
|
||||||
|
a.textContent = article.title;
|
||||||
|
li.appendChild(a);
|
||||||
|
navList.appendChild(li);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
navList.innerHTML = '<li><span class="sidebar-loading">暂无文档</span></li>';
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(function(error) {
|
||||||
|
console.error('Error loading document list:', error);
|
||||||
|
document.getElementById('doc-nav-list').innerHTML = '<li><span class="sidebar-loading">加载失败</span></li>';
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Vendored
BIN
Binary file not shown.
@@ -0,0 +1,35 @@
|
|||||||
|
# Oraset Package (.orp)
|
||||||
|
# 包名:hello-world
|
||||||
|
# 版本:1.0.0
|
||||||
|
# 描述:一个简单的 Hello World 示例包,包含 Lua 代码
|
||||||
|
|
||||||
|
version: 1.0.0
|
||||||
|
name: hello-world
|
||||||
|
description: A simple Hello World example package with Lua code
|
||||||
|
author: Oraset Team
|
||||||
|
license: MIT
|
||||||
|
|
||||||
|
# Lua 代码部分
|
||||||
|
lua:
|
||||||
|
-- 这是一个 Lua 脚本示例
|
||||||
|
print("Hello from Lua!")
|
||||||
|
print("这个包已经成功安装")
|
||||||
|
|
||||||
|
-- 定义一个简单的函数
|
||||||
|
function greet(name)
|
||||||
|
return "Hello, " .. name .. "!"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- 调用函数
|
||||||
|
print(greet("Oraset"))
|
||||||
|
|
||||||
|
-- 数学计算
|
||||||
|
print("计算结果: 2 + 3 = " .. (2 + 3))
|
||||||
|
|
||||||
|
-- 循环示例
|
||||||
|
print("数字 1 到 5:")
|
||||||
|
for i = 1, 5 do
|
||||||
|
print(" " .. i)
|
||||||
|
end
|
||||||
|
|
||||||
|
print("Lua 代码执行完成!")
|
||||||
Vendored
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Vendored
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Vendored
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,105 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Oraset Linux 一键安装脚本 (DEB)
|
||||||
|
# 版本: 4.0.1-BetaN(+AU)
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# 版本检查 URL
|
||||||
|
VERSION_URL="https://oraset.parlz.com/download/version.txt"
|
||||||
|
DEB_URL_BASE="https://oraset.parlz.com/download/deb"
|
||||||
|
|
||||||
|
echo "🚀 开始安装 Oraset..."
|
||||||
|
|
||||||
|
# 检查系统架构
|
||||||
|
ARCH=$(uname -m)
|
||||||
|
if [ "$ARCH" != "x86_64" ]; then
|
||||||
|
echo "❌ 错误: 此安装脚本仅支持 x86_64 架构"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查是否有管理员权限
|
||||||
|
if [ "$EUID" -ne 0 ]; then
|
||||||
|
echo "⚠️ 需要管理员权限来安装 Oraset"
|
||||||
|
echo "请使用 sudo 运行此脚本,或者输入密码:"
|
||||||
|
sudo -v
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查网络连接
|
||||||
|
check_network() {
|
||||||
|
if ! curl -s --head --fail "$VERSION_URL" > /dev/null 2>&1; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 获取最新版本号
|
||||||
|
get_latest_version() {
|
||||||
|
if command -v curl &> /dev/null; then
|
||||||
|
LATEST_VERSION=$(curl -s "$VERSION_URL")
|
||||||
|
elif command -v wget &> /dev/null; then
|
||||||
|
LATEST_VERSION=$(wget -q -O- "$VERSION_URL")
|
||||||
|
else
|
||||||
|
echo "❌ 错误: 需要 curl 或 wget"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "$LATEST_VERSION"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "🔍 正在检查最新版本..."
|
||||||
|
if check_network; then
|
||||||
|
LATEST_VERSION=$(get_latest_version)
|
||||||
|
if [ -z "$LATEST_VERSION" ]; then
|
||||||
|
echo "⚠️ 无法获取最新版本信息,使用默认版本"
|
||||||
|
LATEST_VERSION="4.0.1-BetaN(+AU)"
|
||||||
|
else
|
||||||
|
echo "✅ 检测到最新版本: $LATEST_VERSION"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "⚠️ 网络不可用,使用默认版本"
|
||||||
|
LATEST_VERSION="4.0.1-BetaN(+AU)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 创建临时目录
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
echo "📁 创建临时目录: $TEMP_DIR"
|
||||||
|
|
||||||
|
# 下载 DEB 包
|
||||||
|
DEB_FILE="Oraset-Re+$LATEST_VERSION.deb"
|
||||||
|
DEB_URL="$DEB_URL_BASE/$DEB_FILE"
|
||||||
|
DEB_PATH="$TEMP_DIR/$DEB_FILE"
|
||||||
|
|
||||||
|
echo "📥 正在下载 Oraset $LATEST_VERSION..."
|
||||||
|
if command -v curl &> /dev/null; then
|
||||||
|
curl -L -o "$DEB_PATH" "$DEB_URL"
|
||||||
|
elif command -v wget &> /dev/null; then
|
||||||
|
wget -O "$DEB_PATH" "$DEB_URL"
|
||||||
|
else
|
||||||
|
echo "❌ 错误: 需要 curl 或 wget 来下载文件"
|
||||||
|
rm -rf "$TEMP_DIR"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查下载是否成功
|
||||||
|
if [ ! -f "$DEB_PATH" ]; then
|
||||||
|
echo "❌ 错误: 下载失败"
|
||||||
|
rm -rf "$TEMP_DIR"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ 下载完成"
|
||||||
|
|
||||||
|
# 安装 DEB 包
|
||||||
|
echo "🔧 正在安装 Oraset..."
|
||||||
|
sudo dpkg -i "$DEB_PATH"
|
||||||
|
|
||||||
|
# 检查依赖是否完整
|
||||||
|
echo "🔍 检查依赖..."
|
||||||
|
sudo apt-get install -f -y
|
||||||
|
|
||||||
|
# 清理临时文件
|
||||||
|
rm -rf "$TEMP_DIR"
|
||||||
|
echo "🧹 清理临时文件"
|
||||||
|
|
||||||
|
echo "✅ Oraset 安装完成!"
|
||||||
|
echo "运行 'oraset -v' 验证安装"
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Oraset 一键安装脚本
|
||||||
|
# 版本: 4.0.1-Beta
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# 版本检查 URL
|
||||||
|
VERSION_URL="https://oraset.parlz.com/download/version.txt"
|
||||||
|
PKG_URL_BASE="https://oraset.parlz.com/download/pkg"
|
||||||
|
|
||||||
|
echo "🚀 开始安装 Oraset..."
|
||||||
|
|
||||||
|
# 检查系统
|
||||||
|
if [[ "$OSTYPE" != "darwin"* ]]; then
|
||||||
|
echo "❌ 错误: 此安装脚本仅支持 macOS 系统"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查是否有管理员权限
|
||||||
|
if [ "$EUID" -ne 0 ]; then
|
||||||
|
echo "⚠️ 需要管理员权限来安装 Oraset"
|
||||||
|
echo "请使用 sudo 运行此脚本,或者输入密码:"
|
||||||
|
sudo -v
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查网络连接
|
||||||
|
check_network() {
|
||||||
|
if ! curl -s --head --fail "$VERSION_URL" > /dev/null 2>&1; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 获取最新版本号
|
||||||
|
get_latest_version() {
|
||||||
|
if command -v curl &> /dev/null; then
|
||||||
|
LATEST_VERSION=$(curl -s "$VERSION_URL")
|
||||||
|
elif command -v wget &> /dev/null; then
|
||||||
|
LATEST_VERSION=$(wget -q -O- "$VERSION_URL")
|
||||||
|
else
|
||||||
|
echo "❌ 错误: 需要 curl 或 wget"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "$LATEST_VERSION"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "🔍 正在检查最新版本..."
|
||||||
|
if check_network; then
|
||||||
|
LATEST_VERSION=$(get_latest_version)
|
||||||
|
if [ -z "$LATEST_VERSION" ]; then
|
||||||
|
echo "⚠️ 无法获取最新版本信息,使用默认版本"
|
||||||
|
LATEST_VERSION="4.0.1-Beta(..26:.6:12)"
|
||||||
|
else
|
||||||
|
echo "✅ 检测到最新版本: $LATEST_VERSION"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "⚠️ 网络不可用,使用默认版本"
|
||||||
|
LATEST_VERSION="4.0.1-Beta(..26:.6:12)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 创建临时目录
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
echo "📁 创建临时目录: $TEMP_DIR"
|
||||||
|
|
||||||
|
# 下载 PKG 文件
|
||||||
|
PKG_FILE="Oraset-Re+$LATEST_VERSION.pkg"
|
||||||
|
PKG_URL="$PKG_URL_BASE/$PKG_FILE"
|
||||||
|
PKG_PATH="$TEMP_DIR/$PKG_FILE"
|
||||||
|
|
||||||
|
echo "📥 正在下载 Oraset $LATEST_VERSION..."
|
||||||
|
if command -v curl &> /dev/null; then
|
||||||
|
curl -L -o "$PKG_PATH" "$PKG_URL"
|
||||||
|
elif command -v wget &> /dev/null; then
|
||||||
|
wget -O "$PKG_PATH" "$PKG_URL"
|
||||||
|
else
|
||||||
|
echo "❌ 错误: 需要 curl 或 wget 来下载文件"
|
||||||
|
rm -rf "$TEMP_DIR"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查下载是否成功
|
||||||
|
if [ ! -f "$PKG_PATH" ]; then
|
||||||
|
echo "❌ 错误: 下载失败"
|
||||||
|
rm -rf "$TEMP_DIR"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ 下载完成"
|
||||||
|
|
||||||
|
# 安装 PKG
|
||||||
|
echo "🔧 正在安装 Oraset..."
|
||||||
|
sudo installer -pkg "$PKG_PATH" -target /
|
||||||
|
|
||||||
|
# 清理临时文件
|
||||||
|
rm -rf "$TEMP_DIR"
|
||||||
|
echo "🧹 清理临时文件"
|
||||||
|
|
||||||
|
# 验证安装
|
||||||
|
if command -v oraset &> /dev/null; then
|
||||||
|
echo "✅ 安装成功!"
|
||||||
|
echo ""
|
||||||
|
echo "🎉 Oraset $LATEST_VERSION 已成功安装到您的系统"
|
||||||
|
echo ""
|
||||||
|
echo "使用方法:"
|
||||||
|
echo " 查看版本: oraset -v"
|
||||||
|
echo " 运行脚本: oraset your_script.ora"
|
||||||
|
echo ""
|
||||||
|
echo "开始使用 Oraset 吧!"
|
||||||
|
else
|
||||||
|
echo "⚠️ 安装可能未完成,请检查错误信息"
|
||||||
|
echo "您可以尝试手动安装:"
|
||||||
|
echo " sudo installer -pkg $PKG_FILE -target /"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
Vendored
BIN
Binary file not shown.
@@ -0,0 +1,26 @@
|
|||||||
|
CC = gcc
|
||||||
|
CFLAGS = -Wall -Wextra -O2 -std=c11
|
||||||
|
BINDIR = bin
|
||||||
|
|
||||||
|
TARGET = $(BINDIR)/oraset
|
||||||
|
|
||||||
|
SRCS = src/main.c
|
||||||
|
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
$(TARGET): $(SRCS)
|
||||||
|
@mkdir -p $(BINDIR)
|
||||||
|
$(CC) $(CFLAGS) -o $(TARGET) $(SRCS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(TARGET)
|
||||||
|
rm -rf $(BINDIR)
|
||||||
|
|
||||||
|
pkg: all
|
||||||
|
rm -rf pkg-root
|
||||||
|
mkdir -p pkg-root/usr/local/bin
|
||||||
|
cp bin/oraset pkg-root/usr/local/bin/oraset
|
||||||
|
chmod +x pkg-root/usr/local/bin/oraset
|
||||||
|
pkgbuild --root pkg-root --identifier com.oraset.lang --version B-5 --install-location / Oraset-B5.pkg
|
||||||
|
|
||||||
|
.PHONY: all clean pkg
|
||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,25 @@
|
|||||||
|
CC = gcc
|
||||||
|
CFLAGS = -Wall -Wextra -O2 -std=c11
|
||||||
|
BINDIR = bin
|
||||||
|
|
||||||
|
TARGET = $(BINDIR)/oraset
|
||||||
|
|
||||||
|
SRCS = src/main.c
|
||||||
|
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
$(TARGET): $(SRCS)
|
||||||
|
@mkdir -p $(BINDIR)
|
||||||
|
$(CC) $(CFLAGS) -o $(TARGET) $(SRCS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(TARGET)
|
||||||
|
|
||||||
|
pkg: all
|
||||||
|
rm -rf pkg-root
|
||||||
|
mkdir -p pkg-root/usr/local/bin
|
||||||
|
cp bin/oraset pkg-root/usr/local/bin/oraset
|
||||||
|
chmod +x pkg-root/usr/local/bin/oraset
|
||||||
|
pkgbuild --root pkg-root --identifier com.oraset.lang --version 4.0.0 --install-location / Oraset-Re+4.0.0-Release.pkg
|
||||||
|
|
||||||
|
.PHONY: all clean pkg
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
|||||||
|
B-5
|
||||||
@@ -0,0 +1,157 @@
|
|||||||
|
# Oraset 标准库 - std.oinc
|
||||||
|
# 使用方法: oraset -i https://oraset.parlz.com/inc/std.oinc
|
||||||
|
|
||||||
|
# ==================== 数学函数 ====================
|
||||||
|
|
||||||
|
sin(x:double) -> double {
|
||||||
|
return std::sin(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
cos(x:double) -> double {
|
||||||
|
return std::cos(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
tan(x:double) -> double {
|
||||||
|
return std::tan(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
asin(x:double) -> double {
|
||||||
|
return std::asin(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
acos(x:double) -> double {
|
||||||
|
return std::acos(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
atan(x:double) -> double {
|
||||||
|
return std::atan(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
sinh(x:double) -> double {
|
||||||
|
return std::sinh(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
cosh(x:double) -> double {
|
||||||
|
return std::cosh(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
tanh(x:double) -> double {
|
||||||
|
return std::tanh(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
exp(x:double) -> double {
|
||||||
|
return std::exp(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
log(x:double) -> double {
|
||||||
|
return std::log(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
log10(x:double) -> double {
|
||||||
|
return std::log10(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
sqrt(x:double) -> double {
|
||||||
|
return std::sqrt(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
pow(base:double, exp:double) -> double {
|
||||||
|
return std::pow(base, exp);
|
||||||
|
}
|
||||||
|
|
||||||
|
abs(x:double) -> double {
|
||||||
|
return std::abs(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
floor(x:double) -> double {
|
||||||
|
return std::floor(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
ceil(x:double) -> double {
|
||||||
|
return std::ceil(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
round(x:double) -> double {
|
||||||
|
return std::round(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
pi() -> double {
|
||||||
|
return M_PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
e() -> double {
|
||||||
|
return M_E;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==================== 字符串函数 ====================
|
||||||
|
|
||||||
|
strlen(s:string) -> int {
|
||||||
|
return std::strlen(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
strcmp(s1:string, s2:string) -> int {
|
||||||
|
return std::strcmp(s1, s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
strstr(haystack:string, needle:string) -> string {
|
||||||
|
return (char*)std::strstr(haystack, needle);
|
||||||
|
}
|
||||||
|
|
||||||
|
strtolower(s:string) -> string {
|
||||||
|
char* p = s;
|
||||||
|
while (*p) {
|
||||||
|
*p = std::tolower(*p);
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
strtoupper(s:string) -> string {
|
||||||
|
char* p = s;
|
||||||
|
while (*p) {
|
||||||
|
*p = std::toupper(*p);
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==================== 系统函数 ====================
|
||||||
|
|
||||||
|
system(cmd:string) -> int {
|
||||||
|
return std::system(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(code:int) {
|
||||||
|
std::exit(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
getenv(name:string, default_val:string) -> string {
|
||||||
|
char* val = std::getenv(name);
|
||||||
|
return val ? val : default_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==================== 文件操作 ====================
|
||||||
|
|
||||||
|
file_exists(filename:string) -> int {
|
||||||
|
std::ifstream f(filename);
|
||||||
|
return f.good() ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
file_read(filename:string) -> string {
|
||||||
|
std::ifstream f(filename);
|
||||||
|
std::stringstream buffer;
|
||||||
|
buffer << f.rdbuf();
|
||||||
|
return buffer.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
file_write(filename:string, content:string) -> int {
|
||||||
|
std::ofstream f(filename);
|
||||||
|
f << content;
|
||||||
|
return f.good() ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
file_append(filename:string, content:string) -> int {
|
||||||
|
std::ofstream f(filename, std::ios::app);
|
||||||
|
f << content;
|
||||||
|
return f.good() ? 1 : 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Oraset - 简洁高效的编程语言</title>
|
||||||
|
<link rel="stylesheet" href="css/style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="layout">
|
||||||
|
<nav class="sidebar">
|
||||||
|
<div class="sidebar-section">
|
||||||
|
<div class="sidebar-section-title">Oraset</div>
|
||||||
|
<ul>
|
||||||
|
<li><a href="index.php" class="active">首页</a></li>
|
||||||
|
<li><a href="download.php">下载</a></li>
|
||||||
|
<li><a href="releases.php">历史版本</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="sidebar-section">
|
||||||
|
<div class="sidebar-section-title">文档</div>
|
||||||
|
<ul>
|
||||||
|
<li><a href="docs/index.php?list">文档列表</a></li>
|
||||||
|
</ul>
|
||||||
|
<ul id="doc-nav-list">
|
||||||
|
<li><span class="sidebar-loading">加载中...</span></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main class="main">
|
||||||
|
<h1>Oraset</h1>
|
||||||
|
<p>Version: <strong>B-5</strong></p>
|
||||||
|
|
||||||
|
<h2>关于</h2>
|
||||||
|
<p>Oraset 是一个现代化的 C++ 风格脚本语言,功能强大且易于使用。</p>
|
||||||
|
|
||||||
|
<h2>特性</h2>
|
||||||
|
<ul>
|
||||||
|
<li>C++ 风格语法设计</li>
|
||||||
|
<li>轻量级解释器(纯 C 实现)</li>
|
||||||
|
<li>变量定义(let 关键字)</li>
|
||||||
|
<li>数组支持(创建、访问、修改)</li>
|
||||||
|
<li>自定义函数(proc 关键字)</li>
|
||||||
|
<li>条件语句(if-else)</li>
|
||||||
|
<li>循环语句(while、for、do-while)</li>
|
||||||
|
<li>switch-case 语句</li>
|
||||||
|
<li>goto 语句和标签</li>
|
||||||
|
<li>break 和 continue</li>
|
||||||
|
<li>位运算符(&、|、^、~、<<、>>)</li>
|
||||||
|
<li>复合赋值运算符(+=、-=、*=、/=、%=)</li>
|
||||||
|
<li>自增自减运算符(++、--)</li>
|
||||||
|
<li>结构体(struct)</li>
|
||||||
|
<li>枚举(enum)</li>
|
||||||
|
<li>类型别名(typedef)</li>
|
||||||
|
<li>丰富的内置函数(数学、字符串、数组)</li>
|
||||||
|
<li>REPL 交互模式</li>
|
||||||
|
<li>跨平台支持(Windows、macOS、Linux)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>快速开始</h2>
|
||||||
|
<pre>// hello.ora
|
||||||
|
echo("Hello, World!");
|
||||||
|
let x = 42;
|
||||||
|
echo("The value is:", x);
|
||||||
|
|
||||||
|
// 数组
|
||||||
|
let arr = [1, 2, 3];
|
||||||
|
echo(arr[0]);
|
||||||
|
|
||||||
|
// 函数
|
||||||
|
proc add(a, b) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
echo(add(10, 20));</pre>
|
||||||
|
|
||||||
|
<p>运行:<code>oraset hello.ora</code></p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<p>Oraset Project © 2026</p>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
fetch('docs/api.php')
|
||||||
|
.then(function(response) {
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Network response was not ok');
|
||||||
|
}
|
||||||
|
return response.json();
|
||||||
|
})
|
||||||
|
.then(function(data) {
|
||||||
|
var navList = document.getElementById('doc-nav-list');
|
||||||
|
navList.innerHTML = '';
|
||||||
|
if (data.articles && data.articles.length > 0) {
|
||||||
|
data.articles.forEach(function(article) {
|
||||||
|
var li = document.createElement('li');
|
||||||
|
var a = document.createElement('a');
|
||||||
|
a.href = 'docs/index.php?doc=' + article.name;
|
||||||
|
a.textContent = article.title;
|
||||||
|
li.appendChild(a);
|
||||||
|
navList.appendChild(li);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
navList.innerHTML = '<li><span class="sidebar-loading">暂无文档</span></li>';
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(function(error) {
|
||||||
|
console.error('Error loading document list:', error);
|
||||||
|
document.getElementById('doc-nav-list').innerHTML = '<li><span class="sidebar-loading">加载失败</span></li>';
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,256 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>历史版本 - Oraset</title>
|
||||||
|
<link rel="stylesheet" href="css/style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="layout">
|
||||||
|
<nav class="sidebar">
|
||||||
|
<div class="sidebar-section">
|
||||||
|
<div class="sidebar-section-title">Oraset</div>
|
||||||
|
<ul>
|
||||||
|
<li><a href="index.php">首页</a></li>
|
||||||
|
<li><a href="download.php">下载</a></li>
|
||||||
|
<li><a href="releases.php" class="active">历史版本</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="sidebar-section">
|
||||||
|
<div class="sidebar-section-title">文档</div>
|
||||||
|
<ul>
|
||||||
|
<li><a href="docs/index.php?list">文档列表</a></li>
|
||||||
|
</ul>
|
||||||
|
<ul id="doc-nav-list">
|
||||||
|
<li><span class="sidebar-loading">加载中...</span></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main class="main">
|
||||||
|
<h1>历史版本</h1>
|
||||||
|
|
||||||
|
<ul class="version-list">
|
||||||
|
<li>
|
||||||
|
<div class="version-number">B-5</div>
|
||||||
|
<div class="version-date">2026年7月22日</div>
|
||||||
|
<div class="version-desc">
|
||||||
|
全新升级版本。<br>
|
||||||
|
<ul>
|
||||||
|
<li>新增数组类型支持</li>
|
||||||
|
<li>新增自定义函数定义</li>
|
||||||
|
<li>新增复合赋值运算符:+=, -=, *=, /=, %=</li>
|
||||||
|
<li>新增自增自减运算符:++, --</li>
|
||||||
|
<li>新增 REPL 交互模式(oraset -i)</li>
|
||||||
|
<li>新增更多数学函数:tan(), pow(), log(), floor(), ceil(), round()</li>
|
||||||
|
<li>新增数组函数:array(), arrlen()</li>
|
||||||
|
<li>新增 int() 和 float() 类型转换函数</li>
|
||||||
|
<li>支持单引号字符串</li>
|
||||||
|
<li>支持多行注释(/* */)</li>
|
||||||
|
<li>支持行注释(//)</li>
|
||||||
|
<li>rand() 函数支持参数(指定最大值)</li>
|
||||||
|
<li>优化变量查找算法</li>
|
||||||
|
<li>修复多处 bug</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="version-download">
|
||||||
|
<strong>下载:</strong>
|
||||||
|
<ul>
|
||||||
|
<li><a href="download/source/Oraset-B5-source.tar.gz">源码 (tar.gz)</a></li>
|
||||||
|
<li><a href="download/pkg/Oraset-B5.pkg">macOS (pkg)</a></li>
|
||||||
|
<li><a href="download/deb/Oraset-B5.deb">Linux (deb)</a></li>
|
||||||
|
<li><a href="download/exe/Oraset-B5.exe">Windows (exe)</a></li>
|
||||||
|
</ul>
|
||||||
|
<p class="note">💡 或者使用:<code>oraset -u</code> 更新到最新版本</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="version-number">Re+4.0.1-Release(adn+1.0.100+fix)</div>
|
||||||
|
<div class="version-date">2026年6月18日</div>
|
||||||
|
<div class="version-desc">
|
||||||
|
ADN 包管理修复版本。<br>
|
||||||
|
<ul>
|
||||||
|
<li>移除外部 Lua 依赖,使用 Oraset 解释器执行 .orp 扩展包</li>
|
||||||
|
<li>修复词法分析器字符识别问题</li>
|
||||||
|
<li>修复函数调用括号处理错误</li>
|
||||||
|
<li>优化语法分析器逻辑</li>
|
||||||
|
<li>支持 .orp 包格式(使用 Oraset 语言编写扩展代码)</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="version-download">
|
||||||
|
<strong>下载:</strong>
|
||||||
|
<ul>
|
||||||
|
<li><a href="download/source/Oraset-Re+4.0.1-Release(adn+1.0.100+fix)-source.tar.gz">源码 (tar.gz)</a></li>
|
||||||
|
<li><a href="download/pkg/Oraset-Re+4.0.1-Release(adn+1.0.100+fix).pkg">macOS (pkg)</a></li>
|
||||||
|
</ul>
|
||||||
|
<p class="note">💡 或者使用:<code>oraset -u</code> 更新到最新版本</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="version-number">Re+4.0.1-Release(adn+1.0.0)</div>
|
||||||
|
<div class="version-date">2026年6月13日</div>
|
||||||
|
<div class="version-desc">
|
||||||
|
ADN 包管理系统版本。<br>
|
||||||
|
<ul>
|
||||||
|
<li>新增 ADN 包管理系统(.orp 格式)</li>
|
||||||
|
<li>支持包安装:adn(install package) 或 adn(i package)</li>
|
||||||
|
<li>支持包更新:adn(update package) 或 adn(u package)</li>
|
||||||
|
<li>支持包移除:adn(remove package) 或 adn(r package)</li>
|
||||||
|
<li>支持包列表:adn(list) 或 adn(ls)</li>
|
||||||
|
<li>支持仓库管理:adm(mirror url) 添加镜像仓库</li>
|
||||||
|
<li>支持仓库列表:adm(list) 或 adm(ls)</li>
|
||||||
|
<li>默认仓库:https://oraset.parlz.com/download/adn/</li>
|
||||||
|
<li>自动创建 .adn 目录管理包和仓库信息</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="version-download">
|
||||||
|
<strong>下载:</strong>
|
||||||
|
<ul>
|
||||||
|
<li><a href="download/pkg/Oraset-Re+4.0.1-Release(adn+1.0.0).pkg">macOS (pkg)</a></li>
|
||||||
|
</ul>
|
||||||
|
<p class="note">💡 如果您已安装 Oraset-Re+4.0.1-BetaN(+AU) 或更高版本,可使用 <code>oraset -u Oraset-Re+4.0.1-Release(adn+1.0.0)</code> 安装此版本</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="version-number">Re+4.0.1-BetaN(+AU)</div>
|
||||||
|
<div class="version-date">2026年6月12日</div>
|
||||||
|
<div class="version-desc">
|
||||||
|
新增自动更新功能版本。<br>
|
||||||
|
<ul>
|
||||||
|
<li>添加 oraset -u 自动更新命令</li>
|
||||||
|
<li>支持指定版本更新:oraset -u Oraset-Re+4.0.0-Beta</li>
|
||||||
|
<li>自动识别操作系统(Windows/macOS/Linux)</li>
|
||||||
|
<li>从服务器获取最新版本信息</li>
|
||||||
|
<li>自动下载并安装对应平台的安装包</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="version-download">
|
||||||
|
<strong>下载:</strong>
|
||||||
|
<ul>
|
||||||
|
<li><a href="download/source/Oraset-Re+4.0.1-BetaN(+AU)-source.tar.gz">源码 (tar.gz)</a></li>
|
||||||
|
<li><a href="download/pkg/Oraset-Re+4.0.1-BetaN(+AU).pkg">macOS (pkg)</a></li>
|
||||||
|
<li><a href="download/deb/Oraset-Re+4.0.1-BetaN(+AU).deb">Linux (deb)</a></li>
|
||||||
|
<li><a href="download/exe/Oraset-Re+4.0.1-BetaN(+AU).exe">Windows (exe)</a></li>
|
||||||
|
</ul>
|
||||||
|
<p class="note">💡 或者使用:<code>oraset -u</code> 更新到最新版本</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<div class="version-number">Re+4.0.1-Beta(..26:.6:12)</div>
|
||||||
|
<div class="version-date">2026年6月12日</div>
|
||||||
|
<div class="version-desc">
|
||||||
|
新增实用功能版本。<br>
|
||||||
|
<ul>
|
||||||
|
<li>添加数学函数:abs(), sqrt(), sin(), cos(), rand()</li>
|
||||||
|
<li>添加字符串函数:len(), num(), str()</li>
|
||||||
|
<li>添加输入函数:input()</li>
|
||||||
|
<li>添加 for 循环语法</li>
|
||||||
|
<li>添加比较运算符:>=, <=</li>
|
||||||
|
<li>添加取模运算符:%</li>
|
||||||
|
<li>优化代码执行性能</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="version-download">
|
||||||
|
<strong>下载:</strong>
|
||||||
|
<ul>
|
||||||
|
<li><a href="download/source/Oraset-Re+4.0.1-Beta(..26:.6:12)-source.tar.gz">源码 (tar.gz)</a></li>
|
||||||
|
<li><a href="download/pkg/Oraset-Re+4.0.1-Beta(..26:.6:12).pkg">macOS (pkg)</a></li>
|
||||||
|
<li><a href="download/deb/Oraset-Re+4.0.1-Beta(..26:.6:12).deb">Linux (deb)</a></li>
|
||||||
|
<li><a href="download/exe/Oraset-Re+4.0.1-Beta(..26:.6:12).exe">Windows (exe)</a></li>
|
||||||
|
</ul>
|
||||||
|
<p class="note">💡 如果您已安装 Oraset-Re+4.0.1-BetaN(+AU) 或更高版本,可使用 <code>oraset -u Oraset-Re+4.0.1-Beta(..26:.6:12)</code> 安装此版本</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<div class="version-number">Re+4.0.0-Release</div>
|
||||||
|
<div class="version-date">2026年6月12日</div>
|
||||||
|
<div class="version-desc">
|
||||||
|
首个正式 Release 版本。<br>
|
||||||
|
<ul>
|
||||||
|
<li>修复 while 循环逻辑错误</li>
|
||||||
|
<li>修复 if 语句 else 分支处理</li>
|
||||||
|
<li>添加字符串转义支持(\n, \t, \r, \")</li>
|
||||||
|
<li>添加逻辑运算符(&&, ||, !)</li>
|
||||||
|
<li>内存优化,减少动态分配</li>
|
||||||
|
<li>性能优化,支持编译优化</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="version-download">
|
||||||
|
<strong>下载:</strong>
|
||||||
|
<ul>
|
||||||
|
<li><a href="download/source/Oraset-Re+4.0.0-Release-source.tar.gz">源码 (tar.gz)</a></li>
|
||||||
|
<li><a href="download/pkg/Oraset-Re+4.0.0-Release.pkg">macOS (pkg)</a></li>
|
||||||
|
<li><a href="download/deb/Oraset-Re+4.0.0-Release.deb">Linux (deb)</a></li>
|
||||||
|
<li><a href="download/exe/Oraset-Re+4.0.0-Release.exe">Windows (exe)</a></li>
|
||||||
|
</ul>
|
||||||
|
<p class="note">💡 如果您已安装 Oraset-Re+4.0.1-BetaN(+AU) 或更高版本,可使用 <code>oraset -u Oraset-Re+4.0.0-Release</code> 安装此版本</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<div class="version-number">Re+4.0.0-Beta</div>
|
||||||
|
<div class="version-date">2026年6月11日</div>
|
||||||
|
<div class="version-desc">
|
||||||
|
首个公开 Beta 测试版本。<br>
|
||||||
|
<ul>
|
||||||
|
<li>变量声明和赋值</li>
|
||||||
|
<li>表达式计算(算术运算、比较运算)</li>
|
||||||
|
<li>条件语句(if/else)</li>
|
||||||
|
<li>循环语句(while)</li>
|
||||||
|
<li>print 函数(支持 "nel" 参数控制换行)</li>
|
||||||
|
<li>文件级配置(sg 语法)</li>
|
||||||
|
<li>跨平台支持(Windows、macOS、Linux)</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="version-download">
|
||||||
|
<strong>下载:</strong>
|
||||||
|
<ul>
|
||||||
|
<li><a href="download/source/Oraset-Re+4.0.0-Beta-source.tar.gz">源码 (tar.gz)</a></li>
|
||||||
|
<li><a href="download/pkg/Oraset-Re+4.0.0-Beta.pkg">macOS (pkg)</a></li>
|
||||||
|
<li><a href="download/deb/Oraset-Re+4.0.0-Beta.deb">Linux (deb)</a></li>
|
||||||
|
<li><a href="download/exe/Oraset-Re+4.0.0-Beta.exe">Windows (exe)</a></li>
|
||||||
|
</ul>
|
||||||
|
<p class="note">💡 如果您已安装 Oraset-Re+4.0.1-BetaN(+AU) 或更高版本,可使用 <code>oraset -u Oraset-Re+4.0.0-Beta</code> 安装此版本</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<p>Oraset Project © 2026</p>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
fetch('docs/api.php')
|
||||||
|
.then(function(response) {
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Network response was not ok');
|
||||||
|
}
|
||||||
|
return response.json();
|
||||||
|
})
|
||||||
|
.then(function(data) {
|
||||||
|
var navList = document.getElementById('doc-nav-list');
|
||||||
|
navList.innerHTML = '';
|
||||||
|
if (data.articles && data.articles.length > 0) {
|
||||||
|
data.articles.forEach(function(article) {
|
||||||
|
var li = document.createElement('li');
|
||||||
|
var a = document.createElement('a');
|
||||||
|
a.href = 'docs/index.php?doc=' + article.name;
|
||||||
|
a.textContent = article.title;
|
||||||
|
li.appendChild(a);
|
||||||
|
navList.appendChild(li);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
navList.innerHTML = '<li><span class="sidebar-loading">暂无文档</span></li>';
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(function(error) {
|
||||||
|
console.error('Error loading document list:', error);
|
||||||
|
document.getElementById('doc-nav-list').innerHTML = '<li><span class="sidebar-loading">加载失败</span></li>';
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user