Исследуя поведение 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 в эксплуатации и при обучении.
Комментариев нет:
Отправить комментарий