函数
声明函数
函数用 hs(函数 / fn)声明,用 fanhui(返回 / return)返回:
cpro
hs add(a z64, b z64) z64 {
fanhui a +[z64] b
}
hs log(msg zifuchuan) kongbai {
dayin(msg)
}cpro
函数 add(a i64, b i64) i64 {
返回 a +[i64] b
}
函数 log(msg string) void {
打印(msg)
}cpro
fn add(a i64, b i64) i64 {
return a +[i64] b
}
fn log(msg string) void {
print(msg)
}返回类型必须写出
返回类型不能省略,没有返回值写 kongbai(void)。 编译器不做返回类型推断。
cpro
hs add(a z64, b z64) z64 { fanhui a + b } // ✓
hs add(a z64, b z64) { fanhui a + b } // ✗ 缺少返回类型
hs log(msg zifuchuan) kongbai { dayin(msg) } // ✓
hs log(msg zifuchuan) { dayin(msg) } // ✗ 无返回值请写 kongbaicpro
函数 add(a i64, b i64) i64 { 返回 a + b } // ✓
函数 add(a i64, b i64) { 返回 a + b } // ✗ 缺少返回类型
函数 log(msg string) void { 打印(msg) } // ✓
函数 log(msg string) { 打印(msg) } // ✗ 无返回值请写 voidcpro
fn add(a i64, b i64) i64 { return a + b } // ✓
fn add(a i64, b i64) { return a + b } // ✗ 缺少返回类型
fn log(msg string) void { print(msg) } // ✓
fn log(msg string) { print(msg) } // ✗ 无返回值请写 voidfanhui 必须和返回类型匹配:kongbai 函数不能返回值,非 kongbai 函数不能写不带值的 fanhui。
参数
参数必须声明类型,参数名后面的 leixing(类型 / type)可以省略:
cpro
hs add(a leixing z64, b leixing z64) z64 { fanhui a + b } // ✓
hs add(a z64, b z64) z64 { fanhui a + b } // ✓ 推荐cpro
函数 add(a 类型 i64, b 类型 i64) i64 { 返回 a + b } // ✓
函数 add(a i64, b i64) i64 { 返回 a + b } // ✓ 推荐cpro
fn add(a type i64, b type i64) i64 { return a + b } // ✓
fn add(a i64, b i64) i64 { return a + b } // ✓ 推荐默认值
cpro
hs greet(name zifuchuan, times z64 = 3) kongbai {
bl i leixing z64 = 0
dang (i < times) {
dayin(name)
i = i + 1
}
}
rukou() {
greet("cpro") // times = 3
greet("cpro", 1) // times = 1
}cpro
函数 greet(name string, times i64 = 3) void {
变量 i 类型 i64 = 0
当 (i < times) {
打印(name)
i = i + 1
}
}
入口() {
greet("cpro") // times = 3
greet("cpro", 1) // times = 1
}cpro
fn greet(name string, times i64 = 3) void {
var i type i64 = 0
while (i < times) {
print(name)
i = i + 1
}
}
rukou() {
greet("cpro") // times = 3
greet("cpro", 1) // times = 1
}值传递
参数是值传递,函数内修改参数不影响调用方:
cpro
hs bump(n z64) kongbai {
n = n + 1 // 只改本地副本
}
rukou() {
bl x leixing z64 = 1
bump(x)
dayin(x) // 1
}cpro
函数 bump(n i64) void {
n = n + 1 // 只改本地副本
}
入口() {
变量 x 类型 i64 = 1
bump(x)
打印(x) // 1
}cpro
fn bump(n i64) void {
n = n + 1 // 只改本地副本
}
rukou() {
var x type i64 = 1
bump(x)
print(x) // 1
}需要避免大对象拷贝、或者要在函数里修改调用方的变量时,用借用参数 &T,见 借用:
cpro
hs total(p &Person) z64 {
fanhui p.age
}cpro
函数 total(p &Person) i64 {
返回 p.age
}cpro
fn total(p &Person) i64 {
return p.age
}调用
函数可以调用定义在它后面的函数,不需要前置声明;支持递归:
cpro
hs fact(n z64) z64 {
ruguo (n <= 1) { fanhui 1 }
fanhui n * fact(n - 1)
}
rukou() {
dayin(fact(5)) // 120
dayin(fact(fact(3))) // 720
}cpro
函数 fact(n i64) i64 {
如果 (n <= 1) { 返回 1 }
返回 n * fact(n - 1)
}
入口() {
打印(fact(5)) // 120
打印(fact(fact(3))) // 720
}cpro
fn fact(n i64) i64 {
if (n <= 1) { return 1 }
return n * fact(n - 1)
}
rukou() {
print(fact(5)) // 120
print(fact(fact(3))) // 720
}可失败函数
在返回类型后面加 kecuo(可错 / fails),表示函数可能返回错误,详见 错误处理:
cpro
hs parse(n z64) z64 kecuo {
ruguo (n < 0) {
fanhui cuowu("不能是负数")
}
fanhui n
}
rukou() {
changshi {
dayin(parse(42))
} buhuo (e) {
dayin(e.xinxi)
}
}cpro
函数 parse(n i64) i64 可错 {
如果 (n < 0) {
返回 错误("不能是负数")
}
返回 n
}
入口() {
尝试 {
打印(parse(42))
} 捕获 (e) {
打印(e.msg)
}
}cpro
fn parse(n i64) i64 fails {
if (n < 0) {
return Err("不能是负数")
}
return n
}
rukou() {
try {
print(parse(42))
} catch (e) {
print(e.msg)
}
}导出给其他文件
函数默认只在本文件可见,加 daochu(导出 / export)后其他文件才能导入,详见 模块与导入:
cpro
// util.cp
daochu hs helper(x z64) z64 { fanhui x * 2 }
hs internal(x z64) z64 { fanhui x + 1 } // 本文件私有
// main.cp
daoru { helper } laizi "./util.cp"cpro
// util.cp
导出 函数 helper(x i64) i64 { 返回 x * 2 }
函数 internal(x i64) i64 { 返回 x + 1 } // 本文件私有
// main.cp
导入 { helper } 来自 "./util.cp"cpro
// util.cp
export fn helper(x i64) i64 { return x * 2 }
fn internal(x i64) i64 { return x + 1 } // 本文件私有
// main.cp
import { helper } from "./util.cp"不支持
泛型函数、函数重载(同名函数)、具名参数调用(greet(name: "cpro"))均不支持。
