Membuat deklarator khusus


9

Katakanlah saya menggunakan satu set boilerplate tertentu secara teratur:

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

}

Saya lebih suka mengatakan:

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

Dan di suatu tempat di Bar, siapkan deklarasi untuk bar (atau, karena kelas Foo sendiri pada akhirnya akan menggunakan deklaratornya sendiri, ia bisa pergi ke tempat lain dan tidak harus ditarik dalam Tipe terpisah). Bagaimana saya bisa melakukan itu?


Saya mengerti bahwa ini pada dasarnya bertanya "Bagaimana saya BAGAIMANA?" tapi saya belum pernah melihat tulisan nyata, dan modul yang masih ada yang menggunakannya (Merah / Cro) adalah binatang yang cukup kompleks (jika cantik) yang sulit untuk diikuti sekilas.
user0721090601

Sepertinya Anda ingin menggunakan kembali tanda tangan, bukan?
jjmerelo

2
jjmerelo: tidak, sebenarnya tujuan akhir adalah melakukan metode subclass (mendaftarkannya ke kelas jika digunakan di dalamnya) dan menggunakan bahasa yang sama sekali berbeda di dalam blok kode (yang seperti regex, dalam hal ini)
user0721090601

2
jjmerelo: lihat gist.github.com/alabamenhu/2fec7a8f51a24091dc1b104a2ae2f04d untuk proposal. Saya beberapa hari lagi dari memiliki modul uji untuk menunjukkan, tapi saya punya sebagian besar logistik Binex bekerja, tetapi untuk sintaks seperti Raku
user0721090601

Jawaban:


5

-1. Keterbatasan (hanya untuk paket)

Metode EXPORTHOW memanggil .set_how saat ini $?LANGmenambahkan slang ke yang terakhir.
Kemudian add_package_declarator ke MAIN $?LANGyang menambahkan package_declaratormetode untuk Tindakan dan Grammar. Ini, saya pikir, satu-satunya "gaul dinamis" (dalam World.nqp).

Jika yang Anda inginkan adalah menimpa routine_declarator . Maka Anda harus menulis bahasa gaul yang meniru rantai yang baru saja dikutip. Jika Anda setuju untuk menyimpan kata kunci metode dan membuat tanda tangan otomatis di kelas, ucapkan sesuai dengan nama metode, berikut ini caranya:

Catatan: Paket adalah wadah (paket, tata bahasa, modul, peran, pengetahuan, enum, kelas, subset). Jika Anda memasukkan kode ke dalam seperti metode, ini dijalankan (Saya baru saja mencoba):

0. Keterangan (EKSPORTHOW)

Saya akan menggunakan EXPORTHOW tidak berdokumen dan DECLAREdalam modul karena saya tidak menemukan cara dengan Phaser . Tampaknya sudah terlambat bahkan di BEGIN.

Contoh yang saya berikan, adalah mendekorasi setiap metode dalam kelas (datar BUILDALL).

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. Dapat dieksekusi

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. Output

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

4. Sumber


Luar biasa. Sederhana dan mudah. Terima kasih!
user0721090601
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.