demo语言文档
类型
- 整数类型:Int,有非负整数字面量
-
tuple类型:(Ts),
其中Ts是一个以逗号分隔的非空类型列表
-
借用类型:&T(共享/只读借用)
或&mut T(独占/读写借用),
其中T是一个类型。
借用类型的含义是只有受限的使用权限的指针
-
函数类型:fun (params) -> ret,
其中params是以逗号分隔的类型列表,为函数的参数的类型。
ret是函数的返回值的类型
程序的结构
本demo中的程序由一系列函数定义构成,函数定义形如:
fun function_name(arg1 : type1, ...) {
function_body // 一个表达式
}
返回值就是函数体表达式的结果,其类型可以自动推导,不需要也暂时无法手动标注。
函数在声明时支持一种特殊语法,来指定函数默认的“传参模式”。
例如,考虑函数print(x : &T)。
调用它时,往往需要手动创建借用,例如print(&expr)。
这有时会成为语法噪音。为此,可以将print的第一个参数的默认传参方式声明为
“按只读借用传递”:
print2(&x : T)
注意&的位置的变化。
现在,向print2传递参数时,编译器会按照默认传参模式自动插入一个&。
上面的例子直接写作print2(expr)即可。
如果已经有一个只读借用,想要传给print2,也很简单。
只需要写成print2(*existing_borrow)即可。
表达式的语法
本demo中的语言只有表达式,没有语句。
它主要用于演示borrow checker,
所以设计上和borrow checker无关的部分能简则简,
请不要用看待正常语言的眼光来看它:
- 非负整数字面量
-
定义变量:let name = expr; ...,
必须有定义后的body,暂不支持类型标注
-
顺序执行:expr1; expr2,
等价于let _ = expr1; expr2。
变量名必须以小写字母或下划线开头
-
默认对变量的使用是移动:path。
其中path是一条路径,可能是:
- 一个变量x
-
一个tuple的路径的一部分path.i,
其中i是一个自然数下标,
用于选择tuple中的第i个元素(从1开始)
-
一个借用指向的数据*path。
对借用的解引用在语法上的优先级低于tuple下标
-
借用:&path(共享/只读借用)
或&mut path
(独占/读写借用)
- 赋值:path := rhs
- tuple:(exprs),
其中exprs是以逗号分隔的一串表达式。
括号是不能省略的的
-
条件表达式:if condition { conseq } else { alter }。
其中condition是一个整数,
它是否等于0就是if的判断条件。
conseq是条件不为0时执行的分支,
alter是条件为0时执行的分支。
-
循环表达式:while cond { body }。
其中cond是一个类型为Int的表达式,
它为0时循环结束,否则循环继续。
body是一个表达式。
循环体的返回值可以是任意类型,整个循环表达式的类型是整数