4.1. 函数调用

我们在之前的章节中已接触过很多函数,比如常用的内置打印函数 println。函数调用的一般语法为:

函数名(实参列表)

实参指函数调用时实际传入的参数,与之对应的是函数声明时定义的形参,形参只在函数体内有效。凹语言在调用函数时,参数使用值传递,在函数体内对形参值的变更不会影响实参的值,例如:

// 版权 @2023 凹语言 作者。保留所有权利。

func Double(i: i32) => i32 {
    i = i * 2
    return i
}

func main {
    j: i32 = 42
    println(Double(j)) // 84
    println(j)         // 42
}

关键字 return 用于退出函数并返回值,一般语法为:

return 返回值列表

如果函数有多个返回值,应使用 , 分隔,例如:

func MulRet() => (i32, i32) {
    return 42, 13
}

类似于形参,函数声明时可定义具名返回值,例如:

func showAnswer() => (answer: i32) {
    answer = 42
    return
}

这种写法等价于:

func showAnswer() => i32 {
    answer: i32
    answer = 42
    return answer
}

与其他变量类似,具名返回值以 0 值初始化。假如某个函数需要返回错误码、分支很多并且大多数分支错误码为 0 值,则使用具名返回值写法可以简化代码。

即使声明了具名返回值,return 时仍然可以指定别的值,比如:

// 版权 @2019 凹语言 作者。保留所有权利。

func showAnswer() => (answer: i32) {
    answer = 13
    return 42
}

func main {
    println(showAnswer()) // 42
}

因此我们可以这样来理解:具名返回值实际上是在函数体内定义了一组局部变量,当该函数内的return 语句未指明返回值时,自动将这一组局部变量作为返回值填入。