语言参考
言序 0.3 alpha 的值、类型、控制流、函数、对象、容器、错误与模块语法。
值、变量与类型
令 数目:数 为 42;
令 比例:数 为 3.14;
令 题名:文 为 「天地玄黄」;
令 可行:理 为 真;
令 未有:空 为 空;
令 灵活:任意 为 42;
定 名录:列 为【「甲」,「乙」】;
置 数目 为 数目 加 1;类型标注可以省略;省略后变量可接纳任意类型。带标注变量在初次声明和每次置时都会检查。定声明的绑定不可重新指向别的值,但其所指列或典仍可按下标修改。
内置类型:
| 类型 | 含义 |
|---|---|
数 | 数值 |
文 | 文字 |
理 | 真或假 |
空 | 空值 |
法 | 用户函数或内置函数 |
类 | 类本身 |
对象 | 任意类的实例 |
模块 | 模块命名空间 |
列 | 有序可变序列 |
典 | 保持插入顺序的映射 |
误 | 可捕获的结构化运行错误 |
任意 | 不限制值类型 |
| 类名 | 指定类的实例 |
数值目前使用十进制阿拉伯数字。文字可写成「文字」、“文字”或"文字"。
运算
| 层级(由高到低) | 运算符 |
|---|---|
| 调用/成员 | 函数(参数)、对象.成员 |
| 一元 | 非、!、- |
| 乘除 | 乘、除、*、/、×、÷ |
| 加减 | 加、减、+、- |
| 比较 | 大于、不小于、小于、不大于、>、>=、<、<= |
| 相等 | 等于、不等于、==、!= |
| 逻辑且 | 且 |
| 逻辑或 | 或 |
且和或会短路求值。加既可用于两个数相加,也可用于两段文字相接。
列、典与下标
定 名录:列 为【「甲」,「乙」】;
追加(名录,「丙」);
置 名录【1】为「仲」;
言 名录【0】;
言 弹出(名录);
令 次序:典 为 {「甲」:1,「仲」:2};
置 次序【「丙」】为 3;
言 次序【「仲」】;
言 有键(次序,「丙」);列可用【】或[]。典使用{键:值},键仅可为数、文、理或空;重复键保留原位置并更新值。列下标和文字下标须为从零开始的非负整数。读取不存在的键或越界下标会产生可捕获错误。
长度适用于文字、列和典;追加与弹出会原地修改列。
统一迭代
逐 项:文 于 名录 则
言 项;
终
逐 键 于 次序 则
言 次序【键】;
终逐列得到元素,逐文字得到单字符文字,逐典得到键。每次迭代的变量都是新的不可改写绑定,闭包可安全捕获当次值。
结构化错误
试 则
抛「所求数据不存在」;
救 所误 则
言 所误.消息;
言 所误.踪迹;
终试捕获正文中的运行错误,救绑定一个误值。.消息为文字,.踪迹为调用帧文字组成的列。抛普通值会以其显示文字创建错误;抛已有误值会保留原踪迹。词法、语法和语义错误发生在执行前,不能由试捕获。
流程
若 年岁 不小于 18 且 有凭据 则
言 「可入」;
否则
言 「止步」;
终
当 次数 小于 3 则
言 次数;
置 次数 为 次数 加 1;
终假与空视为不成立,其余值视为成立。
函数与闭包
法 造加法(甲:数):法 则
法 相加(乙:数):数 则
归 甲 加 乙;
终
归 相加;
终
令 加十:法 为 造加法(10);
言 加十(5);参数和返回类型均可省略。参数在调用时检查,返回值在函数结束时检查。无显式归时函数返回空,因此标注了非空返回类型的函数必须显式返回相符值。
类与实例
类 人 则
法 初始化(姓名:文,年岁:数)则
置 此.姓名 为 姓名;
置 此.年岁 为 年岁;
终
法 自述():文 则
归 「吾名」 加 此.姓名;
终
终
令 子:人 为 人(「言序」,2);
言 子.自述();
置 子.年岁 为 3;调用类会创建实例并调用初始化。实例字段在首次置 此.字段时建立。成员读取先查字段,再查方法;方法取出时自动绑定此。
0.2 尚未提供字段类型声明、可见性、继承和接口;这些属于 0.4 对象类型阶段。
模块
引「模块/数术.yx」为 数术;
言 数术.平方(9);也可写作引「模块/数术.yx」作 数术;。相对路径以包含导入语句的文卷目录为基准,不受启动命令所在目录影响。
模块只执行一次,后续导入复用缓存。模块成员不能由外部改写,循环导入会报错。0.2 会导出模块全部顶层绑定;未来版本将引入公关键字并默认隐藏未公开成员。
REPL
不带文件运行yanxu即可进入 REPL。类、函数、判断和循环可跨多行输入;终闭合后统一执行。表达式语句显示为⇒ 值。
| 命令 | 用途 |
|---|---|
:助 / :help | 查看帮助 |
:退 / :quit | 退出 |
:清 / :clear | 重建解释器并清空上下文 |
:载 路径.yx | 在当前上下文执行文卷 |
简化文法
program → declaration* EOF ;
declaration → "令" IDENT type? "为" expression ";"
| "定" IDENT type? "为" expression ";"
| functionDecl
| classDecl
| importDecl
| statement ;
type → ":" TYPE_NAME ;
functionDecl → "法" IDENT "(" parameters? ")" type? "则" declaration* "终" ;
classDecl → "类" IDENT "则" functionDecl* "终" ;
importDecl → "引" STRING ("为" | "作") IDENT ";" ;
statement → "置" (IDENT | member | index) "为" expression ";"
| "言" expression ";"
| "若" expression "则" declaration* ("否则" declaration*)? "终"
| "当" expression "则" declaration* "终"
| "逐" IDENT type? "于" expression "则" declaration* "终"
| "试" "则" declaration* "救" IDENT "则" declaration* "终"
| "抛" expression ";"
| "归" expression? ";"
| expression ";" ;
call → primary (("(" arguments? ")") | ("." IDENT) | ("【" expression "】"))* ;
primary → literal | IDENT | list | map | "(" expression ")" ;
list → "【" arguments? "】" ;
map → "{" (expression ":" expression) ("," ...)* "}" ;
expression → 逻辑或、逻辑且、相等、比较、加减、乘除、一元、调用、原子表达式 ;#或//起始至行末为注释。