【问题标题】:Is it possible to create new lexical symbols in other contexts at runtime?是否可以在运行时在其他上下文中创建新的词汇符号?
【发布时间】:2019-08-09 05:40:12
【问题描述】:

我正在编写一个用于创建具有自定义行为的枚举的模块。我目前所做的是将枚举添加到 GLOBAL 包中,但这不会安装任何词法符号,除非您在一个模块中创建枚举并从另一个模块中导入它。使用BEGIN $*W.install_lexical_symbol(...) 不是一个选项,因为枚举的值可以从网络连接中获取,并且会阻塞编译直到接收到值。是否可以在运行时在调用者的上下文中安装词法符号?如果有,怎么做?

【问题讨论】:

    标签: raku lexical-scope


    【解决方案1】:

    枚举有自己的metamodel。您可以通过使用它来声明具有新行为的新枚举。这有点棘手,但它肯定会创建一些安装在您想要的词法范围内的东西。

    【讨论】:

    • 我一直在用它。问题是我想将它安装在与它声明的词法范围不同的词法范围内。
    【解决方案2】:

    我要直截了当地说“不”。

    (我通常会后悔在 P6 上这样做,但嘿嘿。)

    我的主要证据是像 "the set of symbols in a lexical scope is immutable after compile time" 这样的 cmets。

    也许拿一个病包去阅读How to define variable names dynamically in Perl 6? 的建议,这些建议既邪恶又不够邪恶,不足以做我认为你要求的事情。

    吐完后,请密封袋子,然后访问the freenode IRC channel #perl6-dev,那里有真正的内脏相关专家。 (我想你知道这一点,但我想我会把它包含在这个答案中以供后代使用,因为我似乎有一种病态的幽默感。)

    【讨论】:

    • 我意识到,即使我可以在运行时安装词汇符号,它也无济于事,因为它们在编译时仍然是未定义的,并且如果枚举值对它们进行任何引用,则会引发错误当时未知。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2016-04-17
    • 2023-04-07
    相关资源
    最近更新 更多