Làm một khai báo tùy chỉnh


9

Giả sử tôi sử dụng một bộ nồi hơi nhất định khá thường xuyên:

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

}

Tôi chỉ muốn nói:

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

Và ở đâu đó trong Bar, hãy thiết lập khai báo cho thanh (hoặc, vì lớp Foo cuối cùng sẽ tự sử dụng công cụ khai báo của riêng mình, nó có thể đi đến một nơi khác và không cần phải rút ra trong một Loại riêng). Làm thế nào tôi sẽ đi về làm điều đó?


Tôi hiểu rằng điều này về cơ bản là hỏi "Làm thế nào để tôi làm thế nào?" nhưng tôi chưa thấy bất kỳ bài viết thực sự nào và các mô-đun còn sử dụng nó (Red / Cro) là những con thú khá phức tạp (nếu đẹp) rất khó theo dõi trong nháy mắt.
user0721090601

Có vẻ như bạn muốn sử dụng lại chữ ký, phải không?
jjmerelo

2
jjmerelo: không, thực ra mục tiêu cuối cùng là thực hiện một lớp con phương thức (đăng ký nó với lớp nếu được sử dụng bên trong nó) và sử dụng một ngôn ngữ hoàn toàn khác bên trong khối mã (trong trường hợp này giống như regex)
user0721090601

2
jjmerelo: xem gist.github.com/alabamenhu/2fec7a8f51a24091dc1b104a2ae2f04d để biết đề xuất. Tôi còn vài ngày nữa mới có một mô-đun thử nghiệm để hiển thị, nhưng tôi đã có hầu hết các hoạt động hậu cần của Binex, nhưng với cú pháp giống Raku
user0721090601

Câu trả lời:


5

-1. Hạn chế (chỉ dành cho gói)

Phương thức EXPORTHOW gọi .set_how trên hiện tại $?LANGthêm một tiếng lóng vào sau.
Sau đó, nó add_package_declarator để MAIN $?LANGthêm package_declaratorphương thức vào Hành động và Ngữ pháp của nó. Theo tôi, đó là "tiếng lóng động" duy nhất (trong World.nqp).

Nếu những gì bạn muốn là ghi đè lên Rout_declarator . Sau đó, bạn phải viết một tiếng lóng bắt chước chuỗi vừa trích dẫn. Nếu bạn chấp nhận giữ từ khóa phương thức và tạo chữ ký tự động trong lớp, hãy nói theo tên phương thức, đây là một cách:

Lưu ý: Gói là một thùng chứa (gói, ngữ pháp, mô-đun, vai trò, bí quyết, enum, lớp, tập hợp con). Nếu bạn đặt mã bên trong giống như một phương thức, điều này sẽ được thực thi (Tôi vừa thử):

0. Mô tả (XUẤT KHẨU)

Tôi sẽ sử dụng EXPORTHOW không có giấy tờ và DECLAREtrong một mô-đun vì tôi không tìm thấy đường nào với Phaser . Rõ ràng là đã quá muộn ngay cả tại BEGIN.

Ví dụ tôi đưa ra, là trang trí mọi phương thức trong một lớp (chẵn BUILDALL).

1. Thiên Bình ( 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. Thực thi

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. Đầu ra

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

4. Nguồn

  • Grammar :: Debugger : xuất một ký hiệu (ngữ pháp) ghi đè find_methodadd_method
  • Và NQPTraceHOW :: track-on của npq : Looping với for $_.HOW.method_table($_)việc tạo một hàm băm mới ghi đè lên bộ đệm phương thức bằng (được đặt tên tốt) nqp::setmethcache.
  • Để tự động hóa chữ ký, hãy chơi với .signature
  • Jnthn bài viết trên EXPORTHOW
  • Vì vậy, đăng trên EXPORTHOW không thể với vai trò

Thông minh. Đơn giản, và đơn giản. Cảm ơn!
user0721090601
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.