标签: meta-object-protocol

如何创建一个不从任何其他类继承的类?

如果您创建一个类:

class Foo { }
Run Code Online (Sandbox Code Playgroud)

该类将继承其所有方法Any,然后Mu.

我想创建一个不从任何其他类继承的类:它应该包含一个FALLBACK方法,该方法应该捕获对该对象实例的所有方法调用.

我查看了MetaModel代码,但似乎没有一种简单的方法来实现这一目标.欢迎所有建议!

更新:我决定采用Jonathan Worthington所描述的拦截任何方法调用方式.这导致CPAN上有两个新的Perl 6模块:InterceptAllMethodsObject :: Trampoline.

perl6 mop meta-object-protocol raku

10
推荐指数
2
解决办法
220
查看次数

使用 EXPORTHOW 使声明符的行为类似于“sub”

2011 年优秀的 Raku Advent of Raku 后元编程:什么、为什么和如何提供了一些使用EXPORTHOW创建行为类似的声明器的清晰示例class。这是第一个:

my class SingleInheritanceClassHOW
    is Metamodel::ClassHOW
{
    method add_parent(Mu $obj, Mu $parent) {
        if +self.parents($obj, :local) > 0 {
            die "Multiple inheritance is forbidden!";
        }
        callsame;
    }
}
my module EXPORTHOW { }
EXPORTHOW.WHO.<class> = SingleInheritanceClassHOW;
Run Code Online (Sandbox Code Playgroud)

有没有办法对声明器执行类似的操作sub(即允许用户提供签名和块,而不是允许用户提供属性和方法)?a 的元类SubClassHOW,所以看起来类似的东西应该是可能的,但我没有看到这样做的方法。

metaprogramming object rakudo meta-object-protocol raku

7
推荐指数
1
解决办法
84
查看次数

什么是命名语法规则的元对象规则

本期所述,某些令牌名称与语法的类层次结构中的方法名称冲突(包括Match,Capture,Cool,Any和显然是My.).例如,'Mu.item

grammar g {
    token TOP { <item> };
    token item { 'defined' }
};
say g.parse('defined');
Run Code Online (Sandbox Code Playgroud)

发出如下错误:

Too many positionals passed; expected 1 argument but got 2?  
in regex item at xxx
Run Code Online (Sandbox Code Playgroud)

item也是Anys方法的一部分 ; 我没有在其他类中找到任何其他类,其名称通常失败,但是没有定义的子类(除了item); 大多数是multis或实际定义为method.

当类似TWEAKBUILD子方法用于标记名称时也会发生这种情况,但在这种情况下的错误是不同的:

Cannot find method 'match': no method cache and no .^find_method?
at xxx
Run Code Online (Sandbox Code Playgroud)

但是,其他类似的方法FALLBACK完全没有问题:

grammar g { …
Run Code Online (Sandbox Code Playgroud)

grammar perl6 meta-object-protocol

6
推荐指数
2
解决办法
136
查看次数

从类外部更改类变量

最后,当我设法理解如何解决这个问题,即如何更改内部动态变量的值时,代码已经移动,现在它以这种方式声明:

my int $is-win = Rakudo::Internals.IS-WIN;
Run Code Online (Sandbox Code Playgroud)

这是在里面声明的类变量class Encoding::Builtin.因为操作系统不是在变量的生命周期中发生变化的东西,所以在世界上具有全部意义.但是,我需要从其他操作系统测试此代码,因此我需要访问该类变量并为其赋值True.我可以使用元对象协议吗?

perl6 meta-object-protocol

2
推荐指数
1
解决办法
136
查看次数