言序文档

语言参考

言序 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   → 逻辑或、逻辑且、相等、比较、加减、乘除、一元、调用、原子表达式 ;

#//起始至行末为注释。

本页目录