Rio 的语法设计简洁直观,让初学者能够快速上手。
变量声明
在 Rio 语言中,变量定义使用var关键字,其相关规则与特性如下:
1. 标识符命名规范
● 允许包含字母、数字和下划线,首字符只能是字母或下划线
● 命名风格建议:
○ 变量名、函数名:采用小写驼峰(如userName)或全小写加下划线(如user_name)
○ 类名:采用大写驼峰(如UserAccount)
2. 变量类型规则
● 定义时可在标识符后加:指定类型(如var age: int)
● 不指定类型时默认为any(动态类型),支持自动类型切换
● 显式指定类型的变量为静态类型,不可自动切换类型
● 动态类型与静态类型可通过显式重新设置类型实现相互转换
// 显式类型声明
var name: str = "Rio"
var age: int = 1
var scores: list = [1, 2.01, true, "string"]
// 类型系统
// 默认为 any 类型,any 类型可以自动切换为其他数据类型
var message = "Hello"
message = 0
// 也可手动切换至具体类型,切换后将取消自动切换功能,需手动切回 'any' 类型才能恢复自动切换。
message: str = "world"
// 手动切换回 'any' 类型
message: any = true
控制流
Rio 语言的控制流结构包含以下类型,具体规则如下:
1. if-elif-else 判断控制结构
● if、elif 后跟的判断表达式可省略括号
● 整体采用多分支递进判断逻辑
2. while 循环控制结构
● 循环条件表达式支持省略括号
● 满足条件时持续执行循环体代码
3. for 循环控制结构
● 语法结构与常规形式不同,需在紧跟的圆括号中包含三段语句:
○ 第一句:初始化语句(循环开始前执行)
○ 第二句:循环判断语句(每次迭代前检查,决定是否继续)
○ 第三句:迭代执行语句(每次循环体结束后执行)
● 圆括号表达式后直接衔接循环体代码块
import(io="io")
// if-elif-else 条件判断
if age < 18 {
io.sout("未成年人")
} else {
io.sout("未成年人")
}
// while 循环
var i: int = 0
while i < 5 {
io.sout("计数: ", i)
i + +
}
// for 循环
for ({var i = 0; i < 5; i + +}) {
io.sout("计数:", i)
}
函数定义
在 Rio 语言中,函数定义使用 fun 关键字,函数标识符的命名规则与变量定义中的标识符命名规则一致。函数参数、返回值及相关规则如下:
1. 参数类型分类
● 位置参数(positional argument):可通过 : 限制参数类型(推荐做法)
● 关键字参数(keyword argument):使用 = 设置参数默认值,可通过位置传递,但推荐使用关键字传递
● 变长位置参数(variable-length positional argument):在参数名前加 * 标识
● 变长关键字参数(variable-length keyword argument):在参数名前加 ** 标识
2. 参数处理与排序规则
● 函数调用时,编译器会先收集所有传递的参数,按位置参数和关键字参数分类
● 实参中的位置参数和关键字参数顺序,不影响形参中位置参数的解析与匹配,会按函数参数签名依次配对
● 推荐的函数形参顺序为:位置参数、变长位置参数、关键字参数、变长关键字参数
3. 返回值规则
● 通过参数表后加 : 指定返回类型,不指定时默认为 any 类型,默认返回值为 null
● 特殊返回类型 void:返回类型为 void 的函数类型标签为 func,其他返回类型的函数标签为 funi
● 类型区别:func 类型函数明确无返回值,其调用表达式不能作为右值传递,仅能作为独立的函数调用语句使用;funi 类型函数则可返回指定类型的值并参与表达式运算
import(io="io", ds="ds", prog="prog")
// func 类型函数定义
fun print(role: str, *msgs, end="\n"): void {
io.sout(ds.joins("[", role, "]: ", ds.join(msgs, "")), end=end)
}
// funi 类型函数定义
fun max(a: int, b: int): int {
if a > = b {
ret a
} else {
ret b
}
}
// 定义接收函数作为参数的函数
fun call(callable: func, arg, msg="Hello world", end="\n"): void {
callable(arg, msg, end=end)
}
fun main(*args, **kwargs): int {
// 调用 print 函数
print("System", "Hello world from Rio!", " ", "How are you", end="?\n")
// 将 max 函数的调用表达加入其他表达式参与运算
io.sout("The max number of [5, 10, 20] is ", max(10, max(5, 20)))
// 调用接收函数为参数的函数
call(print, "System")
ret 0
}
// 将函数作为参数进行传递
prog.entry(main)