Что эта рекомендация означает для руководящих принципов 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

Другие вопросы по тегам