Skip to content

Macro Arguments_宏参数 ​

宏可以根据它们接受的参数类型大致分成两类:一类需要你传入一个表达式,另一类则需要你传入用空格隔开的离散参数。每个宏的文档都会说明它具体需要哪种参数形式。(宏参数就两种口味——要么给个「表达式」让它自己算,要么给一堆「独立参数」让它排排坐。分不清?看文档里的 <<set>>(表达式)和 <<link>>(离散参数)对比就懂了。)

需要表达式的那些宏用起来相当简单直接,因为你只需提供一个表达式就行。

离散参数类型的宏在大多数情况下也相当简单直接,因为你只需提供用空格分隔的必要参数(这些参数可以包含变量——因为 SugarCube 会自动把变量的值传递给宏)。不过,有些情况会变得有点复杂:你需要将变量名本身作为参数传递(而不是变量的值),或者需要将某个表达式的计算结果作为参数传递。

参数类型宏:将变量名作为参数传递 ​

把变量名当作参数传进去会出问题,因为 SugarCube 的宏里会自动把变量替换成它的值(而不是保留变量名本身)。也就是说,当你把变量作为参数传递时,传给宏的是变量的值而不是变量名。

通常情况下,这正是你希望发生的——毕竟大多数时候你确实想把变量的值传给宏。但偶尔也有例外:比如某些数据输入类的宏需要变量名(而非值),这样它们才能对变量本身进行修改。这时候怎么办呢?你得给变量名加上引号「封印」起来——比如正常传递变量时你会写 $myVar(传的是值),但这时候得写成 "myVar"(传的是名称本身)。

例如:

SugarCube
<<textbox "$pie" "">>

注意:这种需要传变量名的情况非常少见,而且每个宏的文档都会特别注明,例子里也会明确演示怎么操作。

参数类型宏:把表达式当作参数传递 ​

把表达式的结果当作参数传递时会出现问题,主要有两个原因:一是宏的参数解析器默认不会把参数当作表达式来处理,二是解析器会用空格来分隔各个参数。

通常来说,这些都不算什么大问题,因为你其实不大会频繁需要把表达式的结果当作参数来用。不过,万一真遇到需要这么做的情况,解决办法也很简单——要么用临时变量,要么用反引号表达式。

比如下面这种写法会出错,因为宏的解析器会误以为你在传递五个独立的参数,而不是一个单独的表达式:

SugarCube
<<link "Wake " + $friend + ".">> … <</link>>

这时候你可以先用一个临时变量存住表达式的计算结果,然后再把这个变量传给宏:

SugarCube
<<set _text to "Wake " + $friend + ".">>
<<link _text>> … <</link>>

不过,更好的解决办法是用反引号表达式——这其实是宏参数里一种特殊的引用形式,它会让反引号里的内容先被求值,然后把结果作为单个参数传递出去:

SugarCube
<<link `"Wake " + $friend + "."`>> … <</link>>

提示:反引号(`)在键盘上也被称为「重音符」,通常和波浪号(~)共用一个按键(按下是反引号,按 Shift 键则是波浪号)。

评论