【问题标题】:Making a custom declarator制作自定义声明器
【发布时间】:2020-04-06 16:24:50
【问题描述】:

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

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 中被拉出)。我该怎么做呢?

【问题讨论】:

  • 我知道这基本上是在问“我该怎么做?”但我还没有看到任何真正的文章,使用它的现存模块(Red / Cro)是相当复杂(如果漂亮)的野兽,一目了然。
  • 看来你想重用签名,对吧?
  • jjmerelo:不,实际上最终目标是创建一个方法子类(如果在其中使用,则将其注册到类中)并在代码块中使用完全不同的语言(类似于正则表达式的语言,在本例)
  • jjmerelo:请参阅gist.github.com/alabamenhu/2fec7a8f51a24091dc1b104a2ae2f04d 以获取提案。我还有几天要展示一个测试模块,但我已经完成了 Binex 的大部分后勤工作,但对于类似于 Raku 的语法

标签: raku


【解决方案1】:

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

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

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

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

0。说明(EXPORTHOW)

我会在module 中使用未记录的EXPORTHOWDECLARE,因为我没有找到使用Phaser 的方法。显然,即使在 BEGIN 也为时已晚。

我给出的例子是装饰类中的每个方法(甚至是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。来源

【讨论】:

  • 优秀。简单,直接。谢谢!
猜你喜欢
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2021-06-25
  • 2015-03-02
  • 2014-02-06
  • 2021-10-29
  • 2017-11-02
相关资源
最近更新 更多