制作自定义声明符


9

假设我相当定期地使用一组特定的样板:

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中拉出)。我将如何去做?


我知道这基本上是在问“我怎么做?” 但是我还没有看到任何真正的内容,并且使用它的现存模块(红色/ Cro)是相当复杂(如果很漂亮)的野兽,很难一目了然。
user0721090601

看来您想重用签名,对吗?
jjmerelo

2
jjmerelo:不,实际上,最终目标是要做一个方法子类(如果在内部使用,请在类中注册),并在代码块内使用完全不同的语言(在这种情况下,类似于regex)
user0721090601

2
jjmerelo:请参阅gist.github.com/alabamenhu/2fec7a8f51a24091dc1b104a2ae2f04d。我距离要展示一个测试模块还有几天的路程,但是我已经完成了Binex的大部分工作,但是使用了类似Raku的语法
user0721090601

Answers:


5

-1。限制(仅针对包装)

当前,方法EXPORTHOW调用.set_how$?LANG向后者添加一个lang语
然后,将add_package_declaratorMAIN $?LANG添加到,从而package_declarator为其Actions和Grammar 添加一个方法。我认为,这是唯一的“动态语”(在World.nqp中)。

如果您要覆盖的是例程例程。然后,您必须编写一个just语来模仿刚刚引用的链。如果您接受保留method关键字并在类中进行自动签名,请根据方法名称说,这是一种方法:

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

0.说明(导出)

我会在模块中使用未记录的EXPORTHOW,因为找不到Phaser的方法。显然,即使在BEGIN,也为时已晚。DECLARE

我给出的示例是修饰类中的每个方法(甚至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.资料来源


优秀的。简单明了。谢谢!
user0721090601
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.