EasyScript 是一种为追求极致简洁、易学和结构清晰而设计的脚本语言。在新版本中,它完全采纳了 “一切皆表达式” (Everything is an Expression) 的设计哲学,具备现代编程所需的所有核心功能,但通过消除“语句”和“表达式”之间的概念鸿沟,将语言的语义统一性提升到极致。
EasyScript 的目标是成为初学者的完美基石语言,让学习者能专注于算法逻辑和数据流,而非记忆复杂的语法和优先级规则。
EasyScript 解释器现在支持从命令行直接执行脚本文件。
用法:
cargo run <文件路径>示例:
运行 examples/hello.es 脚本:
cargo run examples/hello.es运行结果将打印到控制台。如果文件不存在或包含语法错误/运行时错误,解释器将输出相应的错误信息。
EasyScript 的设计围绕两大核心原则:“一切皆表达式” 和 “清晰、可预测、不意外” 的运行时。
这种设计通过消除“语句”和“表达式”之间的概念鸿沟,将语言的语义统一性提升到极致,同时通过强类型和明确的真值规则来避免其他动态语言中常见的“魔法”和陷阱。
| 特性 | 示例 (Expression-Style) | 描述 |
|---|---|---|
| 函数定义 | myFunc = fun(x) { x * x } |
fun 定义的表达式返回一个可执行的函数对象。函数体的最后一个表达式作为返回值。 |
声明 (let) |
let myVar = 10; |
let 是一个表达式,用于在当前作用域声明并初始化一个新变量(实现遮蔽)。它返回被赋的值。 |
| 重新赋值 | myVar = 20; 或 myDict["key"] = 1; |
重新赋值是一个表达式,返回 nil。仅能对已存在的变量进行操作,若变量不存在则抛出运行时错误。常以分号 ; 结尾以表示其主要目的是副作用。 |
| 属性访问/赋值 | myObj.prop = 1; 或 value = myObj.prop; |
. 是字典/Map 访问的语法糖。myObj.prop 等价于 myObj["prop"]。 |
| 方法调用 | myObj.method(arg1, arg2) |
像 Lua 一样,. 方法调用会自动将 myObj(即 self)作为第一个参数传入函数。 |
| 条件分支 | result = if a > 10 { 1 } else { 0 }; |
if 是表达式,返回分支代码块的值。如果无 else 且条件不满足,返回 nil。 |
| 列表转换循环 | b = for x in a { x + 1 }; |
For Expression 专用于集合转换(即 map 操作)。它遍历集合,收集循环体内最后一个表达式的值,返回一个新的列表。 |
| 副作用循环 | for item in range(0, 10) { sum = sum + item; }; |
如果 for 循环的返回值被忽略或赋值给一个变量,它主要用于执行副作用。 |
| Block 表达式 | let res = { let x = 10; x * 2 }; |
独立的 Block 表达式是创建局部作用域和封装复杂逻辑的强大工具。它返回其内部最后一个表达式的值。 |
| 特性 | 实现方式 |
|---|---|
| 空值 | 唯一的 nil 值,用于表示空值和无意义的返回值 (Unit/Void)。 |
| 列表 (List) | 支持使用字面量 [1, a+b, true] 构造。 |
| 字典 (Dict/Map) | 支持使用键值对字面量 {"key": 1, 2: "b"} 构造。 对象即 Map。 |
| 高优先级访问 | 列表/字典的索引操作 [ ] 和属性的点访问 . 具有最高的优先级。 |
EasyScript 的新设计证明了极简、功能强大和语义优雅可以完美共存。通过将整个语言统一到“表达式”的概念下(包括灵活的 Block 表达式),并引入高效的语法糖,我们创建了一个语法更简洁、语义更统一、且完全具备执行任何算法能力的脚本语言。它是学习函数式编程思想和语言设计理念的理想选择。
EasyScript 提供了一些环境变量,帮助开发者调试运行时行为:
DEBUG_GC: 设置为1以启用垃圾回收器(GC)的详细分配和回收日志。例如:DEBUG_GC=1 cargo run