.. SPDX-License-Identifier: GFDL-1.3-or-later 函数定义和调用,以及数组 ======================== fkparse多少也算一门编程语言了(或许),因此对函数的支持自然也必不可少。本章向大家介绍在使用fkparse时,如何定义和调用自己的函数。 定义函数 -------- 所谓函数,其实就是一段给定了一些前提条件(也就是函数参数)的代码块而已。通过定义函数,我们少写许多重复的代码。在三国杀这个体系中,“函数”大约就相当于“定义新概念”吧。三国杀也是通过定义一堆新概念来减少描述字数的,虽然搞得有点儿难懂= = fkparse中,定义一个函数的格式如下: :: 定义函数 <标识符> <定义参数表> [返回 <类型标识符>] <代码块> 定义函数的位置也有讲究,所有的函数必须定义在第一个技能之前,也就是说所有的函数都定义完成后才能开始自定义技能。 这里我们又遇到了两个没有见过的新东西:\ ``<参数表>``\ 和\ ``<类型标识符>``\ 。下面一起来看看吧。 类型标识符 ~~~~~~~~~~ 类型标识符是一个词法单元,它可以取如下的一些格式:\ *数字类型、布尔类型、字符串类型、玩家类型、卡牌类型、数字数组、字符串数组、玩家数组、卡牌数组*\ 。这些东西都不需要引号,它们用来指定一些变量的类型。 定义参数表 ~~~~~~~~~~ 所谓定义参数表,就是函数定义的时候用到的参数表,这个取名主要是为了和“调用参数表”区分开来。(至于调用参数表又是啥,后面就知道了) 定义\ ``<定义参数表>``\ 的格式如下: :: '(' { <定义参数> ',' } [定义参数] ')' 而\ ``<定义参数>``\ 的格式为: :: <标识符> ':' <类型标识符> [ '=' <表达式> ] <标识符>是参数的名称,<类型标识符>表示这个参数需要的类型。后面的<表达式>表示这个参数的默认值。 定义好定义参数表后,函数体(也就是函数定义的格式的那个<代码块>)就可以随意将参数当做已经定义了的变量使用了,类似其他编程语言那样。 如果函数有返回类型,那么别忘记在某处使用返回语句。 调用函数 -------- 定义了函数后,自然还有函数的调用了。调用函数的格式为: :: <标识符> <参数表> 参数表 ~~~~~~ 相对于定义参数表,调用函数时候的参数表格式为: :: '(' { <参数> ',' } [参数] ')' 参数的格式为: :: <标识符> ':' <表达式> <标识符>是对应于函数定义那里的那个参数的名字,<表达式>则是参数的取值。 需要注意的是,在调用函数时的参数表中,各个参数没有顺序要求(毕竟已经指明参数的名字了),但是对于没有默认值的参数,必须手动给它指定值。 由于函数调用既能用来执行一些动作,又能产生值,所以它既可以作为表达式,又可以作为语句。但是当单独的函数调用作为语句的时候,需要在后面跟上一个分号,表示这是一个单独的语句。 对数组的操作 ------------ fkparse提供了数组类型,那自然必不可少的就是数组的操作了。 遍历 ~~~~ 所谓遍历数组,就是对数组中每个元素逐个进行某些操作。比如想要做到“对所有其他角色各造成一点伤害”,但是造成伤害的语句只允许对一个人造成伤害,这时候我们就需要遍历“其他角色”这个数组,然后一一造成伤害了。 遍历数组的格式为: :: 对 <表达式> 中每个 <标识符> 重复此流程: <代码块> 以上 其中,<表达式>是需要遍历的数组,必须为数组类型;<标识符>表示数组中正在被遍历的那个元素,可以在接下来的代码块中作为变量使用;<代码块>是循环体,也就是前面说的“某种操作”。 插入元素 ~~~~~~~~ fkparse支持对数组的头部和尾部插入新元素。 从头部插入的语法为: :: 向 <表达式> 插入 <表达式> 从尾部插入的语法为: :: 向 <表达式> 追加 <表达式> 上面两个语法中,第一个<表达式>是被操作的数组,第二个表达式是要插入的元素。元素必须符合数组的类型才行。 删除元素 ~~~~~~~~ fkparse支持删除数组中的某个元素。格式为: :: 从 <表达式> 删除 <表达式> 上面两个语法中,第一个<表达式>是被操作的数组,第二个表达式是要删除的元素。 遍历、插入、删除这三个操作可以作为语句使用。 获得数组的信息 ~~~~~~~~~~~~~~ fkparse支持获得数组的长度,以及根据数组下标取得元素。这两个操作可以作为表达式使用。 要获得长度的话,直接’数组’的"长度"这样就行了。根据下标取得元素的格式为: :: <表达式> 第 <表达式> 个元素 数组的下标从1开始。