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 快速试验,并将脚本用于日常自动化。