自定义函数
除了青语言内置的函数之外,我们自己编写代码时,也可以讲自己的逻辑代码封装为函数。
这样的函数我们就称为——自定义函数。
自定义函数的格式如下:
@函数名 = @【参数列表】{
…… 函数代码块 ……
}
其中参数列表是定义函数可以接收的参数,最基础的形式是变量名的形式,我们也称其为形参,例如:
@双倍 = @【#甲】{
#甲 * 2
}
这里我们定义了一个函数双倍,需要接收一个参数。在调用函数时,传入的第一个参数会被绑定到函数内部的变量#甲,所以在函数的代码块内,我们就可以通过#甲来访问传入的参数(实际传入的参数我们又称为实参)。
这个代码块中,我们对参数#甲的值乘以2,由于这个表达式是代码块的最后一个表达式,所以这个表达式的结果就会作为函数的返回值。
接下来我们可以试着调用我们自定义的函数@双倍,并传入1个参数5
@双倍、5
可以看一下在青编辑器中的表现:

右边是输入的代码,左边是代码运行的结果,可以看到,对函数调用的结果是10,符合我们的预期。
我们也可以定义多个参数:
@乘积 = @【#甲,#乙】{
返回 #甲 * #乙 ;这里用关键字 返回 指定了要返回的值
@显示、“这是返回后的代码” ;返回执行后,函数调用结束,这一句不会执行
}
这里我们定义了一个有两个参数的函数@乘积,接收两个参数 #甲和#乙,在代码块中,我们使用关键字返回来指定了要返回的值。当执行了返回表达式之后,函数的调用就结束了,那么其后的代码就不会执行。我们试着调用一下:
@乘积【2,3】
这里会返回6,并且没有执行@显示语句
对于自定义参数,如果传入的参数个数少于我们设定的参数个数,那么缺少的参数会被填充为空,例如:
@显示一个值 = @【#甲】{
@显示、#甲
}
@显示一个值【】 ;由于没有传入参数,所以 #甲 的值是 空,会显示 空,然后返回一个空
如果传入的参数个数多于我们设定的参数个数,多出的参数不会处理
有时我们希望给出参数的默认值,那么可以使用命名形参,和普通的形参不一样的是,命名形参在形式上是一个赋值表达式,例如:
@乘积 = @【#甲,#乙=2】{
#甲 * #乙
}
这里,我们还是定义了一个函数@乘积,并且定义了一个命名形参#乙=2,这表示当我们没有传入#乙对应的实参时,它的默认值就是2。我们试着调用一下这个函数:
@乘积【5】
这里我们只传入了一个参数5,会绑定到#甲上,而没有给出#乙的值,此时#乙会被赋值为默认值2,所以这里会返回 10
有的时候,我们不想使用命名形参的默认值,而是希望指定它的值,那么可以这样调用:
@乘积【5,#乙=5】
这里我们调用是为命名形参#乙指定了对应的值5,所以这一次会返回 25
如果我们希望自定义函数能和原生函数一样,显示函数的描述信息,这样可以帮助使用者了解函数的功能和使用方法,那么应该如何实现呢?
在定义函数时,参数列表中如果出现了字符串,那么就会作为函数的描述信息。字符串可以出现在参数列表中的任意位置,如果出现多次,会拼接为一个字符串。例如:
@双倍 = @【#甲,“参数1-数字,返回数字;返回参数乘以2的值”】{
#甲 * 2
}

这样一来,我们通过函数名就可以看到函数的描述。
注意,青语言是一门动态类型语言,所以我们无法检查函数被调用时实际会传入什么类型的参数,所以比较好的方式是在函数内检查参数的类型,确定类型符合要求后再进行处理,例如:
@双倍 = @【#甲,“参数1-数字,返回数字;返回参数乘以2的值”】{
如果 @取类型【#甲】 等于 “整数” 或 @取类型【#甲】 等于 “小数” {
#甲 * 2
}否则 {
抛出 “参数类型错误”
}
}