Özel bir bildirimde bulunma


9

Diyelim ki belirli bir kazan plakasını oldukça düzenli kullanıyorum:

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;
    …
  }

}

Sadece şunu söyleyebilirim:

class Foo is/does Bar {
  bar  abc   { … }
  bar  xyz   { … }
  bar  blarg { … }
}

Ve Bar'da bir yerde, bar için deklarasyonu ayarlayın (veya sınıf Foo'nun kendisi sonuçta kendi bildiricisini kullanacağı için, başka bir yere gidebilir ve ayrı bir Tipte çıkarılması gerekmez). Bunu nasıl yapabilirim?


Bunun temel olarak "NASIL NASIL YAPILIRIM?" ancak gerçek bir yazı görmedim ve onu kullanan mevcut modüller (Kırmızı / Cro) bir bakışta takip edilmesi zor olan oldukça karmaşık (güzelse) canavarlardır.
user0721090601

İmzaları tekrar kullanmak istediğiniz anlaşılıyor, değil mi?
jjmerelo

2
jjmerelo: hayır, aslında nihai hedefi bir yöntem alt sınıfı yapmaktır (içindeki kullanıldığı takdirde sınıfla kayıt) ve (bu durumda, bir tek regex benzeri) kodu bloğunun içinde tamamen farklı bir dil kullanarak
user0721090601

2
jjmerelo: bkz gist.github.com/alabamenhu/2fec7a8f51a24091dc1b104a2ae2f04d öneri için. Göstermek için bir test modülüne sahip olmaktan birkaç gün uzaktayım, ancak Binex'in lojistiğinin çoğunu aldım, ancak Raku benzeri sözdizimi için
user0721090601

Yanıtlar:


5

-1. Sınırlamalar (sadece paketler için)

EXPORTHOW yöntemi , ikincisine argo ekleyerek geçerli olarak .set_how öğesini çağırır $?LANG.
Sonra add_package_declarator için MAIN $?LANGbir ekler package_declaratoronun Eylemler ve gramerine yöntemi. Bence tek "dinamik argo" (World.nqp içinde).

İstediğiniz şey routine_declarator üzerine yazmaksa . O zaman, atıfta bulunulan zinciri taklit eden bir argo yazmalısınız. Method anahtar sözcüğünü saklamayı ve sınıfta otomatik imza oluşturmayı kabul ederseniz, yöntem adına göre diyelim, işte bir yol:

Not: Paket bir kaptır (paket, dilbilgisi, modül, rol, knowhow, numaralandırma, sınıf, altküme). Kodu bir yöntem gibi içine koyarsanız, bu yürütülür (Ben sadece denedim):

0. Tanım (İHRACAT)

Phaser ile bir yol bulamadığım için belgelenmemiş EXPORTHOW ve DECLAREbir modülde kullanırım . Görünüşe göre BEGIN'de bile çok geç.

Verdiğim örnek, bir sınıftaki (çift BUILDALL) her yöntemi dekore etmektir .

1. Lib ( 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. Yürütülebilir

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. Çıktı

Before BUILDALL
After BUILDALL
Before abc
In abc: 1:2
After abc

4. Kaynaklar


Mükemmel. Basit ve anlaşılır. Teşekkürler!
user0721090601
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.