3

这些编码指南提到(我相信这是正确的)“[...]在函数/方法参数列表中的逗号后插入空格”。

遵循一个示例,但随后是:

出于显而易见的原因,此建议不适用于 $$$macro-call 中的参数,其中这些额外的空格会破坏最终结果。

我不是一个经验丰富的 ObjectScript 开发人员,远非如此,所以出于好奇,我尝试了这个:

ClassMethod foo()
{
    #define concat(%1, %2) %1 _ %2
    w $$$concat("foo", "bar"), !
}

执行此方法时,它会返回“预期”结果:

foobar

那么,该建议所指的那些“明显原因”是什么?

4

2 回答 2

4

开发人员很懒惰,我们也不例外。虽然宏定义如此灵活,我可以写很多有趣的东西,以简化开发过程。可以在 github上看到我的一个例子。

#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
于 2016-02-19T05:18:08.270 回答
2

另一个原因是某些宏表达式被评估until-first-whitespace,例如##if

于 2016-02-19T19:59:23.900 回答