SimpleLang 完整教程

版本 1.0.0 轻量脚本 · 渐进式指南
从零掌握语法、控制流、函数、标准库与实际开发
1. 简介与安装 2. 基础语法 3. 控制流 4. 函数 5. 数组与字典 6. 标准库详解 7. 进阶特性 8. 实战案例

1. SimpleLang 简介与安装

SimpleLang 是一门语法简洁、动态类型的脚本语言,内置文件处理、HTTP请求、JSON、正则、SQLite、加密、时间、数组增强等标准库。解释器基于 Python 实现,单一文件即可运行,支持 REPL 交互模式、脚本执行和命令行代码片段。

安装与运行

下载 sl.py 后确保 Python 3.6+ 环境,无需额外依赖。运行方式:

# 进入 REPL 交互环境
python sl.py

# 执行脚本文件
python sl.py script.sl

# 直接执行代码字符串
python sl.py -c "print(\"Hello SimpleLang\")"

# 查看版本
python sl.py -v
说明:在 REPL 中支持多行输入(自动检测花括号平衡),可使用 .exit 退出,.help 查看帮助,.vars 查看变量。

2. 基础语法

2.1 变量声明与数据类型

使用 var 关键字声明变量,动态类型。支持数字、字符串、布尔、null、数组、字典。

var age = 25;               // 整数
var price = 19.99;          // 浮点数
var name = "SimpleLang";    // 字符串
var active = true;          // 布尔
var data = null;            // 空值

2.2 运算符

算术:+ - * / %;比较:== != < > <= >=;逻辑:&& || !;赋值复合:+= -= *= /= %=;自增自减:++ --

var x = 10;
x += 5;      // x = 15
var isOk = (x > 10) && (name == "SimpleLang");

2.3 注释

// 单行注释
/* 多行
   注释 */

2.4 输入与输出

print("结果: ", 42);            // 输出
var userInput = input("请输入: "); // 输入字符串
input_str num;                   // 读取数字(自动转换)
input name;                      // 读取字符串

3. 控制流语句

3.1 条件判断 if-else

var score = 85;
if (score >= 90) {
    print("优秀");
} else if (score >= 60) {
    print("及格");
} else {
    print("不及格");
}

3.2 循环 while / for / for-in

// while 循环
var i = 0;
while (i < 5) {
    print(i);
    i = i + 1;
}

// 传统 for 循环
for (var j = 0; j < 3; j = j + 1) {
    print("for: ", j);
}

// for-in 遍历数组或字典
var arr = ["a", "b", "c"];
for item in arr {
    print(item);
}

var dict = {"name": "sl", "type": "lang"};
for key in dict {
    print(key, "=>", dict[key]);
}

3.3 break 与 continue

for (var k = 0; k < 10; k = k + 1) {
    if (k == 3) continue;
    if (k == 7) break;
    print(k);
}

4. 函数定义与作用域

4.1 函数声明与调用

func add(a, b) {
    return a + b;
}
var sum = add(10, 20);
print(sum);   // 30

4.2 嵌套函数与闭包

func makeCounter() {
    var count = 0;
    func inner() {
        count = count + 1;
        return count;
    }
    return inner;
}
var counter = makeCounter();
print(counter()); // 1
print(counter()); // 2

4.3 返回值与空返回

函数无显式 return 时返回 0;可使用 return expr; 返回值。

5. 复合数据类型:数组与字典

5.1 数组操作

var list = [10, 20, 30];
list[1] = 99;
print(list[1]);          // 99
var len = len(list);     // 3
for item in list {
    print(item);
}

5.2 字典(对象)

var user = {"id": 1, "name": "slang"};
user["score"] = 100;
print(user.name);        // 支持点语法访问字典键
user.age = 22;           // 赋值新字段
print(user.age);

5.3 数组预分配

var fixed[5];      // 长度5的数组,初始值为0
fixed[0] = 100;

6. 标准库函数参考

SimpleLang 将标准库函数直接注册为全局可用,涵盖以下模块:

6.1 文件系统

file_write("test.txt", "content");
var text = file_read("test.txt");
file_append("log.txt", "新行");
file_exists("data.json");      // true/false
file_delete("temp.bin");
var files = file_list_dir(".");
file_mkdir("backup");

6.2 HTTP 请求与 JSON

var resp = http_get("https://api.github.com/zen");
print(resp.status, resp.body);
var postRes = http_post("https://httpbin.org/post", "key=value");
var obj = json_parse('{"lang":"sl"}');
var jsonStr = json_stringify({"ok": true});

6.3 正则表达式

var matches = regex_match("\\d+", "order 12345");
var replaced = regex_replace("\\s+", "-", "hello world");
var found = regex_test("^[A-Z]", "Simple");  // true

6.4 SQLite 数据库

var conn = db_open("mydb.db");
db_execute(conn, "CREATE TABLE IF NOT EXISTS users(id int, name text)");
db_execute(conn, "INSERT INTO users VALUES(1, 'slang')");
var rows = db_query(conn, "SELECT * FROM users");
db_close(conn);

6.5 哈希与编码

var md5 = hash_md5("hello");
var sha256 = hash_sha256("data");
var b64 = base64_encode("SimpleLang");
var decoded = base64_decode(b64);

6.6 数学函数

math_abs(-5); math_sqrt(16); math_pow(2,8);
math_random(); math_random_int(1,100);
math_floor(3.9); math_ceil(3.1);

6.7 时间与延时

var ts = time_now();
var fmt = time_format(ts, "%Y-%m-%d %H:%M:%S");
time_sleep(0.5);

6.8 数组增强函数

var arr = [3,1,2];
array_push(arr, 4);
array_sort(arr);
array_reverse(arr);
var idx = array_index_of(arr, 2);
var slice = array_slice(arr, 1, 3);
array_length(arr);

6.9 字典辅助

dict_keys({"a":1}); dict_values({"b":2});
dict_has({"x":5}, "x"); dict_remove({"a":1},"a");

6.10 字符串处理

str_upper("abc"); str_lower("ABC");
str_contains("hello", "ell");  // true
str_split("a,b,c", ",");        // 数组
str_join("-", [1,2,3]);         // "1-2-3"
str_substring("language", 2, 4);

6.11 内置快捷函数

函数说明示例
len(obj)长度len([1,2]) → 2
range(stop) / range(start,stop)生成整数数组range(2,5) → [2,3,4]
to_int(x) / to_float(x)类型转换to_int("3.14") → 3
to_str(x) / to_bool(x)转字符串/布尔to_bool("true") → true
type_of(v)类型名type_of([]) → "array"

7. 进阶特性与最佳实践

7.1 异常处理 try-catch

try {
    var res = 10 / 0;
} catch (err) {
    print("发生错误: ", err);
}

7.2 导入 Python 模块

import "math";          // 导入 Python math 模块
var pi = math.pi;
print(pi);
注意:通过 import 语句可以加载任意 Python 标准库或已安装模块,扩展性极强。

7.3 作用域规则

SimpleLang 采用词法作用域,函数内部可以访问外部变量。使用 var 声明变量时会在当前作用域创建变量。支持块级作用域(函数/循环内独立作用域)。

var global = 100;
func test() {
    var inside = 200;
    print(global);  // 可以访问外部
}
test();

7.4 链式访问与方法调用

支持对象.成员 以及 对象.方法() 语法,对于字典可以直接调用存储的函数。

var obj = {"greet": func() { print("hello"); }};
obj.greet();   // 调用字典中的函数

8. 完整实战案例

案例1: 待办事项管理器 (文件存储)

var filename = "todos.json";
func load_todos() {
    if (file_exists(filename)) {
        var data = file_read(filename);
        return json_parse(data);
    }
    return [];
}
func save_todos(todos) {
    var json = json_stringify(todos);
    file_write(filename, json);
}
func add_todo(task) {
    var todos = load_todos();
    array_push(todos, task);
    save_todos(todos);
    print("已添加: ", task);
}
func list_todos() {
    var todos = load_todos();
    for (var i = 0; i < len(todos); i = i + 1) {
        print(i, ". ", todos[i]);
    }
}
// 演示
add_todo("学习 SimpleLang");
add_todo("编写脚本");
list_todos();

案例2: 天气查询工具 (HTTP + JSON)

func get_weather(city) {
    var url = "https://wttr.in/" + city + "?format=j1";
    var resp = http_get(url);
    if (resp.status == 200) {
        var data = json_parse(resp.body);
        var temp = data["current_condition"][0]["temp_C"];
        print(city, "当前温度: ", temp, "°C");
    } else {
        print("获取天气失败");
    }
}
get_weather("Beijing");

案例3: 简易 Web 爬虫(正则提取链接)

func extract_links(url) {
    var resp = http_get(url);
    if (resp.status == 200) {
        var links = regex_match("href=[\"']([^\"']+)[\"']", resp.body);
        for link in links {
            print("链接: ", link);
        }
    }
}
extract_links("https://example.com");

案例4: 数据库操作演示

var conn = db_open("demo.db");
db_execute(conn, "CREATE TABLE IF NOT EXISTS scores(name TEXT, value INT)");
db_execute(conn, "INSERT INTO scores VALUES('Alice', 95)");
db_execute(conn, "INSERT INTO scores VALUES('Bob', 87)");
var results = db_query(conn, "SELECT * FROM scores WHERE value > 90");
for row in results {
    print(row["name"], "=>", row["value"]);
}
db_close(conn);
进阶提示: SimpleLang 的数组和字典操作非常灵活,配合标准库可以高效完成文件批处理、API 聚合、数据清洗等任务。
总结: 本教程覆盖了 SimpleLang 从变量、流程控制、函数、复合类型到标准库、异常、导入机制的全部内容,通过实战案例演示了文件、网络、数据库等典型应用。您可以通过 REPL 快速试验,并将脚本用于日常自动化。