gpt4 book ai didi

raku - 制作自定义声明器

转载 作者:行者123 更新时间:2023-12-03 16:18:27 26 4
gpt4 key购买 nike

假设我经常使用一组样板:

class Foo {

method abc($a: $b, $c, +@d) is pure {
use Slang::Bar;

}

method xyz($a: $b, $c, +@d) is pure {
use Slang::Bar;

}

method blarg($a: $b, $c, +@d) is pure {
use Slang::Bar;

}

}

我宁愿说:
class Foo is/does Bar {
bar abc { … }
bar xyz { … }
bar blarg { … }
}

在 Bar 的某个地方,为 bar 设置声明(或者,由于类 Foo 本身最终将使用它自己的声明符,它可以转到其他地方,而不必在单独的 Type 中拉出)。我该怎么做呢?

最佳答案

-1。限制(仅适用于包)

方法EXPORTHOW来电.set_how当前 $?LANG为后者添加俚语。
然后它add_package_declaratorMAIN $?LANG其中添加了 package_declarator方法到它的 Action 和语法。我认为,这是唯一的“动态俚语”(在 World.nqp 中)。

如果你想要覆盖routine_declarator .然后你必须写一个模仿刚才引用的链条的俚语。
如果你接受保留method关键字并在类中进行自动签名,根据方法名称说,这里有一个方法:

注:包是一个容器(包、语法、模块、角色、专有技术、枚举、类、子集)。如果您将代码像方法一样放入其中,则会执行(我刚刚尝试过):

0. 说明(EXPORTHOW)

我会使用未记录的 EXPORTHOWDECLAREmodule因为我没有找到 Phaser 的方法.显然,即使在开始时也为时已晚。

我给出的示例是装饰类中的每个方法(甚至是 BUILDALL )。

1.库(decorator.rakumod)

class DecoratedClassHOW is Metamodel::ClassHOW {
method add_method(Mu $obj, $name, $code_obj) {
sub wrapper ($obj, $a, $b) {
say "Before $name";
my $res = $code_obj($obj, $a, $b);
say "After $name";
return $res;
}
my $res = callwith($obj, $name, &wrapper);
return $res;
}
}

my module EXPORTHOW {
package DECLARE {
constant decorated = DecoratedClassHOW;
}
}

2.可执行
use lib '.';
use decorator-lib;

decorated Foo {
method abc($a, $b) {
say "In abc: $a:$b";
}
}

my $f = Foo.new;
$f.abc(1, 2);

3. 输出
Before BUILDALL
After BUILDALL
Before abc
In abc: 1:2
After abc

4. 来源
  • Grammar::Debugger : 导出符号(语法)覆盖 find_methodadd_method
  • 和 npq 的 NQPTraceHOW::trace-on : 循环使用 for $_.HOW.method_table($_)创建一个新的散列,用(有名的)nqp::setmethcache 覆盖方法缓存.
  • 要自动签名,请使用 .signature
  • 约翰article关于 EXPORTHOW
  • So post关于 EXPORTHOW 无法使用角色
  • 关于raku - 制作自定义声明器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61064396/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com