Что эта рекомендация означает для руководящих принципов InterSystem Russia по github-кодированию (макро)?
Эти руководящие принципы кодирования упоминают (справедливо, я полагаю) "вставлять пробелы после запятой в списке аргументов функций / методов".
Следует примеру, но потом идет:
По понятным причинам эта рекомендация не относится к аргументам в макросе $$$, где такие лишние пробелы будут нарушать конечный результат.
Я не опытный разработчик ObjectScript, отнюдь не так, поэтому из любопытства я попробовал это:
ClassMethod foo()
{
#define concat(%1, %2) %1 _ %2
w $$$concat("foo", "bar"), !
}
И при выполнении этого метода он возвращает "ожидаемый" результат:
foobar
Итак, каковы эти "очевидные причины", на которые ссылается эта рекомендация?
2 ответа
Разработчики ленивы, и мы не исключение. Хотя макроопределения настолько гибки, я могу написать много интересных вещей, чтобы упростить процесс разработки. Вы можете увидеть один из моих примеров здесь, на 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
Другая причина заключается в том, что некоторые макро-выражения оцениваются до первого пробела, например ##if