Help:解析器函数
模板扩展语法是一个MediaWiki扩展,包含多个函数解释器。本扩展的典型语法是:
- {{#函数名: 参数1 | 参数2 | 参数 3 …}}
目前有预定义的函数:expr,if,ifeq,ifexpr,switch(rand暂时被废除)。
各函数名都对大小写不敏感。
语句中的空格、换行等空白字符将被省略。
expr
expr函数,计算数学表达式。支持的运算符有:
运算符 | 名称 | 优先级 | 元数 | 样例 |
---|---|---|---|---|
+ | 正 | 9 | 1 | {{#expr: + 7}} = 7 |
- | 负 | 9 | 1 | {{#expr: - 7}} = -7 |
not | 逻辑非 | 9 | 1 | {{#expr: not 7}} = 0 |
* | 乘 | 8 | 2 | {{#expr: 30 * 7}} = 210 |
/ | 除 | 8 | 2 | {{#expr: 30 / 7}} = 4.2857142857143 |
div | 除 | 8 | 2 | {{#expr: 30 div 7}} = 4.2857142857143 |
mod | 模 | 8 | 2 | {{#expr: 30 mod 7}} = 2 |
+ | 加 | 6 | 2 | {{#expr: 30 + 7}} = 37 |
- | 减 | 6 | 2 | {{#expr: 30 - 7}} = 23 |
round | 舍入 | 5 | 2 | {{#expr: 30 / 7 round 7}} = 4.2857143 |
= | 等于 | 4 | 2 | {{#expr: 30 = 7}} = 0 |
< | 小于 | 4 | 2 | {{#expr: 30 < 7}} = 0 |
> | 大于 | 4 | 2 | {{#expr: 30 > 7}} = 1 |
<= | 小于等于 | 4 | 2 | {{#expr: 30 <= 7}} = 0 |
>= | 大于等于 | 4 | 2 | {{#expr: 30 >= 7}} = 1 |
<> | 不等于 | 4 | 2 | {{#expr: 30 <> 7}} = 1 |
!= | 不等于 | 4 | 2 | {{#expr: 30 != 7}} = 1 |
and | 逻辑与 | 3 | 2 | {{#expr: 30 and 7}} = 1 |
or | 逻辑或 | 2 | 2 | {{#expr: 30 or 7}} = 1 |
round:按照运算符右侧给出的小数点后位数为精确,取四舍五入;若位数为负,则保留到小数点左。
逻辑运算符把假映射为0,把真映射为非0,且返回值只有0或1。
同一表达式中先计算高优先级运算,优先级相同时从左到右运算。括号优先级高于一切。
更复杂的样例:
{{#expr: (100 - 32) / 9 * 5 round 0 }}
= 38(温度转换){{#expr: 3 < 2 < 1}}
= 1{{#expr: 999 * 999 round -2}}
= 998000{{#expr: 999 * 999 round -2}}
= 0{{#expr: 2 = 2 = 1}}
= 1{{#expr: 0 or 1 and 0}}
= 0{{#expr: 10.9 mod 2}}
= 0{{#expr: 11.9 mod 2}}
= 0{{#expr: 30------7}}
= 23{{#expr: 30+++++7}}
= 37{{#expr: .}}
= 0{{#expr: .1}}
= 0.1{{#expr: .1.1}}
= 0.1{{#expr: ( ( ) )}}
={{#expr: ( ( 1 ) )}}
= 1
错误
此函数进行错误检查并给出信息。
- Expression error: stack exhausted:表达式太长,栈耗尽;
- Expression error: unexpected number:不可预期的数字;
- Expression error: unexpected preg_match failure:运算符匹配失败;
- Expression error: unrecognised word "$1":不可识别的运算符;
- Expression error: unexpected $1 operator:不可预期的运算符;
- Expression error: Missing operand for $1:缺少运算数;
- Expression error: unexpected closing bracket:不可预料的“)”
- Expression error: unrecognised punctuation character "$1":不可识别的标点字符;
- Expression error: unclosed bracket:缺少“)”
- Division by zero:零除错误。
错误的样例:
{{#expr: ---...---1}}(110个“-”)
= 表达式错误:堆栈耗尽。{{#expr: ( ) 1}}
= 表达式错误:预期外的数字。{{#expr: 2 d 1}}
= 表达式错误:无法识别词语“d”。{{#expr: * 1}}
= 表达式错误:预期外的*运算符。{{#expr: -}}
= 表达式错误:缺少-的操作数。{{#expr: ( 1 ) )}}
= 表达式错误:预期外的反括号。{{#expr: 壹}}
= 表达式错误:无法识别标点符号“壹”。{{#expr: ( 1}}
= 表达式错误:未封闭的括号。{{#expr: 1 / 0}}
= 除以零。
if
if函数是一个if-then-else结构。语法是:
{{#if: <判断字符串> | <then字符串> [| <else字符串> ]}}
若判断字符串为非空字符串(忽略前导或后缀空格),则函数返回then字符串,否则函数返回else字符串。else字符可被省略而不会造成错误,但函数在判断字符串为空时便会返回空字符串。
ifeq
ifeq比较两个字符串,返回比较结果。语法为:
{{#ifeq: <字符串1> | <字符串2> [| <相等时返回的字符串> [| <不相等时返回的字符串> ]]}}
注意:两个空字符串是相等的。
ifexpr
ifexpr计算数学表达式,并根据计算结果返回字符串。
{{ #ifexpr: <表达式> | <then字符串> | <else字符串> }}
若表达式经计算不为0,则函数返回then字符串,否则函数返回else字符串。表达式语法与expr相同。
switch
switch将一个值与多个预设值比较,若有匹配时则返回指定字符串,即一一映射。语法是:
{{ #switch: <比较值> | <预设值1> [= <结果1>] | <预设值2> [= <结果2>] | ... | <预设值n> [= <结果n>] | [<缺省结果>] }}
switch将从从左往右逐一尝试,直到出现匹配。函数将返回第一个匹配值对应的结果,而忽略后面的匹配值。如果没有匹配,函数将返回缺省结果。如果缺省结果没有设置,函数将返回空串。注意:“缺省结果”是最后一个没有等号的预设值。
switch也可用作满射(多对一,避免重复设置结果)。即某预设值后未设置结果,这样如果该预设值与比较值匹配,则函数返回第一个有结果的预设值的结果。例如:
{{ #switch: <比较值> | <预设值1> | <预设值2> | <预设值3> = <结果3> | <缺省结果> }}
如果比较值与预设值1或预设值2匹配,都将返回结果3。
rand
- 注意:此功能暂时被废除而不可用。
rand函数返回制定范围内的随机数。语法为:
{{#rand: [<下界> [| <上界> ]]}}
默认下界是1,上界是100。