JavaScript Map shadowing
При написании синтаксического анализатора на JavaScript для любого языка, очевидно, используется Map для хранения отображений имен в переменных.
Большинство языков позволяют тем или иным образом переменную во внутренней области видимости скрывать одну во внешней области. Идеальная структура данных для реализации - это функциональная карта. В отсутствие этого, казалось бы, есть две альтернативы.
Рассматривайте Map как функциональную карту, создайте копию внешней карты, добавьте к ней внутреннюю переменную, пусть она будет собирать мусор после окончания внутренней области видимости. Это элегантно, но тратит O(N) время на копирование существующих переменных каждый раз, поэтому может быть медленным, если в заданной точке много переменных.
Пройдите полный императивный стиль, просто используйте одну карту, сохраните старую привязку и восстановите ее в конце внутренней области видимости. Это быстро, но не элегантно и подвержено ошибкам.
Есть ли лучший вариант, который мне не хватает? Есть ли консенсус о том, какой вариант лучше?
1 ответ
Используйте связанный список Map
объекты для представления цепочки областей действия. Если идентификатор не найден в первой ссылке, рекурсивно обойдите остальные до глобальной области видимости.