5 个版本
0.0.5 | 2021 年 1 月 21 日 |
---|---|
0.0.4 | 2021 年 1 月 20 日 |
0.0.3 | 2021 年 1 月 20 日 |
0.0.2 | 2021 年 1 月 20 日 |
0.0.1 | 2021 年 1 月 20 日 |
2 在 #infix
49KB
859 行
Valkyrie 语言规范
LET 绑定
let a; /// 声明不变量 a
let mut lazy ref a; ///可以叠多个修饰词
这里必须加 ;
,否则会无限捕捉 token
类型声明
let (mut a, b, c): (int, int, int)
初始化
let (mut a, b, c) = (1, 2, 3)
其他
let mut a, b, c {
return (1, 2, 3)
}
let
后面 tuple 的括号可以省略不写;
可以用 block 开启新的 scope
let mut a, _, _ = (1,2,3)
有时候表达式有多个返回值,但是如果不需要可以用 _
抑制
Def 绑定
def a() {
pass
}
def final private lazy function(a, b:int?=1) {
pass
}
Lambda
其实 let 和 def 没有多大区别。
只是习惯上用 let 声明变量,def 声明函数。
控制流
If 语句
if a {
}
else if b {
pass
}
else if c {
pass
}
else {
}
While 语句
while(true){
pass
}
For-in 语句
for v in iter {
pass
}
for k, v in iters {
pass
}
同理 for 后面的括号可以省略
in 后面如果不是 Iterator 会尝试转化。
模式匹配
Match 语句
未定义
应用调用
- apply:
var<type_expr>(input_expr, key:value_expr)
统一函数调用语法
UFCS 是指 .操作符
调用时先搜索实例方法,如果没有,那么继续寻找函数。
最终效果使得 a.map(f)
<=> map(a,f)
在语义上就是等价的。
由于这个特性的存在,静态方法和类方法不能再直接使用 .操作符
也就是说不能写成 "42".i64.from()
,而要使用 "42".i64::from()
无括号调用
CWP 是指如果函数不写参数可以省略括号
"42".i64::from
=> "42".i64::from
=> i64::from("42")
索引调用
- 索引:
var[num]
或var[str]
或var[slice]
或var[list]
简短 | 完整 | 结果 |
---|---|---|
a["键"] |
a.键 |
值 |
a[1,2,3] |
a.1.2.3 |
值 |
a[[1,2,3]] |
[a.1,a.2,a.3] |
列表 |
a[1:3:-1] |
a[[3,2,1]] |
列表 |
a[1:3:-1,[1,3,-1]] |
a[1:3:-1][[1,2,3]] |
列表 |
字面量
字符串字面量
字符串可以使用 "
或者 '
定义
""
是标准字符串,默认支持转义,也可以使用 r 禁止 r"\n"
r 是字符串表达式。
数字字面量
2147483647i32
173.5cm
这里 i32
和 cm
是数字表达式,实际输入是字符串。
其他字面量
- true => Boolean::True
- false => Boolean::False
- null => Optional::None
数据
data
类型
type
类
无继承
class A(int,int) {
// 类似 rust 的 Tuple Structs
}
class C: T1, T2 {
a : int; /// 必须写类型
b : int = 2 /// defalut 值
c = false;/// 不支持 let tuple 模式匹配
C() -> C {} ///构造函数
f()->Unit { /// 必须写返回类型
}
}
如果没有定义构造函数,C()
默认会空初始化,也就是对所有字段赋 default。
特质
trait T {
f(){}
}
类扩展
extend C {
f() {}
}
extend C with T {
f(){}
}
def C::f() {
}
重载
函数 Adhoc, undefined
操作符调度
@operator::infix //中缀
@operator::prefix //前缀
@operator::suffix //后缀
@operator::number //数字
@operator::string //字符
不支持 new 操作符,也不支持改变操作符的优先级和结合性
import operator.infix
@infix("+")
def add_string_and_int(s:str,i:int)->Unit{
pass
}
所有类型都必须显式标记
可以在特质中设置
缺少 __infix_add
依赖
~5MB
~104K SLoC