Move readme

This commit is contained in:
2026-01-16 00:02:08 +08:00
parent 9c5a3397d9
commit 4247a59146

217
README.md Normal file
View File

@@ -0,0 +1,217 @@
# Camellya Script Language
一个类似 Lua 的脚本语言,使用 C++23 实现,具有以下特性:
## 特性
- **0-based 索引**:数组和列表从 0 开始索引
- **明确的类型系统**:区分 list 和 map
- **类支持**:支持 class 定义,包含字段和方法
- **静态类型声明**变量需要类型声明number, string, bool, list, map
- **类 Lua 的 API**:提供简单的嵌入式 API
## 语法示例
### 基本类型
```javascript
number x = 10;
string name = "Alice";
bool flag = true;
```
### List0-indexed
```javascript
list numbers = [10, 20, 30];
print(numbers[0]); // 输出: 10
numbers[1] = 99;
```
### Map
```javascript
map person = {"name": "Bob", "age": "25"};
print(person["name"]); // 输出: Bob
person["city"] = "New York";
```
### 函数
```javascript
func add(number a, number b) -> number {
return a + b;
}
number result = add(10, 20);
```
### 类
```javascript
class Person {
number age;
string name;
func sayHi() -> string {
print(name, "says: I'm", age, "years old");
return "Done";
}
}
Person p;
p.age = 10;
p.name = "Peter";
p.sayHi();
```
### 控制流
```javascript
// if-else
if (x > 10) {
print("x is greater than 10");
} else {
print("x is less than or equal to 10");
}
// while loop
number i = 0;
while (i < 5) {
print("Count:", i);
i = i + 1;
}
// for loop
for (number j = 0; j < 3; j = j + 1) {
print("For loop:", j);
}
```
## 编译和使用
### 编译
```bash
mkdir build
cd build
cmake ..
make
```
### 运行示例
```bash
./camellya_test
```
### 嵌入到 C++ 项目
```cpp
#include "library.h"
#include <iostream>
int main() {
camellya::State state;
// 执行脚本字符串
const char* script = R"(
class Person {
number age;
string name;
func sayHi() -> string {
print(name, "says: I'm", age, "years old");
return "Done";
}
}
Person p;
p.age = 10;
p.name = "Peter";
p.sayHi();
)";
if (!state.do_string(script)) {
std::cerr << "Error: " << state.get_error() << std::endl;
}
// 或者从文件执行
state.do_file("script.chun");
// 注册 C++ 函数
state.register_function("my_func",
[](const std::vector<camellya::ValuePtr>& args) -> camellya::ValuePtr {
// 你的实现
return std::make_shared<camellya::NilValue>();
});
return 0;
}
```
## API 参考
### State 类
主要 API 类,类似于 `lua_State`
- `bool do_string(const std::string& script)` - 执行脚本字符串
- `bool do_file(const std::string& filename)` - 执行脚本文件
- `void register_function(const std::string& name, NativeFunction func)` - 注册 C++ 函数
- `ValuePtr get_global(const std::string& name)` - 获取全局变量
- `void set_global(const std::string& name, ValuePtr value)` - 设置全局变量
- `const std::string& get_error()` - 获取最后的错误信息
### 栈操作(类似 Lua
- `void push_number(double value)`
- `void push_string(const std::string& value)`
- `void push_bool(bool value)`
- `void push_nil()`
- `double to_number(int index)`
- `std::string to_string(int index)`
- `bool to_bool(int index)`
- `int get_top()`
- `void pop(int n = 1)`
## 内置函数
- `print(...)` - 打印多个参数到标准输出
- `len(container)` - 返回 list、map 或 string 的长度
## 项目结构
```
camellya/
├── library.h # 主头文件
├── library.cpp # 主实现
├── lexer.h/cpp # 词法分析器
├── parser.h/cpp # 语法分析器
├── ast.h # 抽象语法树定义
├── value.h/cpp # 值类型系统
├── interpreter.h/cpp # 解释器
├── state.h/cpp # 主 API 接口
├── main.cpp # 示例程序
├── example.cml # 示例脚本
└── CMakeLists.txt # 构建配置
```
## 特性对比
| 特性 | Lua | Camellya |
|------|-----|----------|
| 索引起始 | 1 | 0 |
| Table | 统一的 table | 区分 list 和 map |
| 类型 | 动态 | 静态声明 |
| 类 | 通过 metatable | 原生支持 |
| 语法 | `function` | `func` |
| 类型注解 | 无 | 必须声明 |
## 许可证
MIT License
## 版本
当前版本0.1.0