Можно ли создавать новые лексические символы в других контекстах во время выполнения? - PullRequest
5 голосов
/ 18 марта 2019

Я пишу модуль для создания перечислений с пользовательским поведением. В данный момент я добавляю enum в пакет GLOBAL, но он не устанавливает никаких лексических символов, если вы не создадите enum в одном модуле и не импортируете его из другого. Использование BEGIN $*W.install_lexical_symbol(...) не вариант, так как значения для перечисления могут быть получены, скажем, из сетевого соединения, и будут блокировать компиляцию, пока значения не будут получены. Можно ли установить лексический символ в контексте вызывающего во время выполнения? Если да, то как?

Ответы [ 2 ]

6 голосов
/ 19 марта 2019

Я собираюсь сказать «Нет».

(Я обычно учусь сожалеть, что делал это с P6, но что за эй.)

Моим основным доказательством являются комментарии типа «набор символов в лексической области неизменен после времени компиляции» .

Возможно, возьмите больничную сумку и прочитайте предложения по Как динамически определять имена переменных в Perl 6? которые являются злыми и все же недостаточно злыми, чтобы делать то, о чем я думаю, вы просите.

Когда вы закончите рвать, закройте сумку и затем посетите экранIRC канал # perl6-dev , где тусуются настоящие эксперты в вопросах, связанных с кишками.(Я думаю, вы знаете об этом, но подумал, что включу его в этот ответ для потомков и потому, что у меня плохое чувство юмора.)

1 голос
/ 18 марта 2019

Перечисления имеют свою собственную метамодель . Вы можете объявить новые перечисления с новым поведением, используя его. Это немного сложно, но это определенно создаст что-то, что установлено в той лексической области, которую вы хотите.

...