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

MPL-2.0 许可证

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

这里 i32cm 是数字表达式,实际输入是字符串。

其他字面量

  • 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