пятница, 15 апреля 2016 г.

Cache': Где наша переменная цикла?

Исследуя поведение Cache при выполнении циклов я обнаружил, что система имеет существенное отклонение от стандарта MUMPS при работе команды for с переменной цикла.
Согласно стандарту, команда for при итерациях должна обращаться за значениями переменной цикла как к локальной переменной, к тому значению которое есть в данный момент времени. При этом стандарт также четко определяет что является текущим значением локальной переменной в комбинировании с командами new в ее различных формах.

Согласно стандарту, например, если у процесса нет переменных кроме одной i, то выполнение кода
i i=2 n  s i=2
не изменяет поведение остальных команд, поскольку после его выполнения все последующие обращения к переменной i производятся на новом уровне стека, созданном командой n. В то же время мы сохраняем в переменной i значение которое было.

Команда for позволила себе небольшое отклонение от стандартных соглашений. При выполнении команды for интерпретатор cache запоминает также и уровень стека на котором находилась переменная цикла в начале выполнения команды for.

Продемонстрирую это обстоятельство на примере:
 n i
 d cicle
 w i
 q
cicle
 f i=1:1:3 w i i i=2 n  s i=2
 q
При выполнении этого кода cache 5.2.3 выводит строку
1223
В то время как согласно стандарту должно быть
1232
Вывод строки 1223 показывает, что после выполнения new без аргументов команда write продолжает честно брать значение переменной i, но команда for модифицирует переменную на совсем другом уровне стека.

Считаю, что такое отклонение от стандарта должно учитываться MUMPS программистами, использующим cache в эксплуатации и при обучении.

Комментариев нет:

Отправить комментарий