These coding guidelines提及(理所当然,我相信)“[...]在函数/方法参数列表中的逗号后插入空格”。
按照一个例子,但接下来是:
由于显而易见的原因,此建议不适用于$$$ macro-call中的参数,其中此类额外空格将破坏最终结果。
我不是一个经验丰富的ObjectScript开发人员,远非如此,所以出于好奇我试过这个:
ClassMethod foo()
{
#define concat(%1, %2) %1 _ %2
w $$$concat("foo", "bar"), !
}
执行此方法时,它返回“预期”结果:
foobar
那么,这个建议所指的那些“显而易见的原因”是什么?
答案 0 :(得分:4)
开发人员很懒惰,我们也不例外。虽然macro-definitions如此灵活,但我可以编写很多有趣的东西,以简化开发过程。 您可以在github上看到我的一个示例here。
#define NewTempGN(%gn,%i) set %i=$i(^CacheTemp.MyApp),%gn=$name(^CacheTemp.MyApp(%i))
你不能在逗号之后添加空格,因为这个空格也会出现在变量之前,并且这样的代码可能在语法上变得非法。
$$$NewTempGN(gn, ii)
#; transform to
set ii=$i(^CacheTemp.MyApp),gn=$name(^CacheTemp.MyApp( ii))
又一个例子
#define forAll(%gn,%key) set %key="" for { set %key=$order(@%gn@(%key)) quit:%key=""
#define forEnd }
#; some global structure which you want to write
set gn=$na(^mtemp("test"))
set @gn@("val1")
set @gn@("val2")
set @gn@("val1")
#; and simple use with macro
$$$forAll(gn,val)
write !,val
$$$forEnd
答案 1 :(得分:2)
另一个原因是某些宏表达式被评估为 until-first-whitespace ,例如##if