একটি কাস্টম ঘোষক তৈরি


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

এবং বারে কোথাও, বারের জন্য ঘোষণাপত্রটি সেট করুন (বা, যেহেতু ক্লাস ফু চূড়ান্তভাবে তার নিজস্ব ঘোষক ব্যবহার করবে, এটি অন্য কোথাও যেতে পারে এবং পৃথক প্রকারে টানতে হবে না)। আমি কীভাবে এটি করতে যাব?


আমি পেয়েছি যে এটি মূলত জিজ্ঞাসা করছে "আমি কীভাবে করব?" তবে আমি কোনও আসল রচনা আপ দেখিনি, এবং এটি ব্যবহারকারী বিদ্যমান মডিউলগুলি (লাল / ক্রো) মোটামুটি জটিল (যদি সুন্দর হয়) তবে এক নজরে অনুসরণ করা শক্ত।
user0721090601

দেখে মনে হচ্ছে আপনি স্বাক্ষর পুনরায় ব্যবহার করতে চান, তাই না?
jjmerelo

2
jjmerelo: না, আসলে চূড়ান্ত লক্ষ্যটি হল একটি পদ্ধতি সাবক্লাস করা (এটি যদি শ্রেণীর সাথে এটি ব্যবহার করা হয় তবে এটির নিবন্ধকরণ করা) এবং কোড ব্লকের ভিতরে সম্পূর্ণ ভিন্ন ভাষা ব্যবহার করা (এক্ষেত্রে একটি
রেজেক্সের

2
jjmerelo: gist.github.com/alabamenhu/2fec7a8f51a24091dc1b104a2ae2f04d প্রস্তাবটির জন্য দেখুন । দেখানোর জন্য একটি পরীক্ষার মডিউল থাকা থেকে আমি কয়েক দিন দূরে আছি, তবে আমি বাইনেক্সের কাজ করার বেশিরভাগ রসদ পেয়েছি, তবে
রাকুর

উত্তর:


5

-1। সীমাবদ্ধতা (কেবল প্যাকেজগুলির জন্য)

পদ্ধতি EXPORTHOW কল .set_how বর্তমান উপর $?LANGআধুনিক করার জন্য একটি অপভাষা যোগ।
তারপর এটি add_package_declarator করতে MAIN $?LANGযা যোগ করা package_declaratorএর কার্যকলাপের এবং ব্যাকরণ থেকে পদ্ধতি। এটি, আমি মনে করি, এটি একমাত্র "গতিশীল স্ল্যাং" (ওয়ার্ল্ড.এনকিপিতে)।

আপনি যা চান তা হল রুটিন_ডেক্লেটর ওভাররাইট । তারপরে আপনাকে কেবল উদ্ধৃত শৃঙ্খলা অনুকরণ করে একটি গালি লিখতে হবে। আপনি যদি ক্লাসে মেথড কীওয়ার্ডটি রাখতে এবং স্বয়ংক্রিয় স্বাক্ষর করতে স্বীকার করেন তবে পদ্ধতির নাম অনুসারে বলুন, এখানে একটি উপায় রয়েছে:

দ্রষ্টব্য: একটি প্যাকেজ হল একটি ধারক (প্যাকেজ, ব্যাকরণ, মডিউল, ভূমিকা, জ্ঞান, এনুম, শ্রেণি, উপসেট)। যদি আপনি কোনও পদ্ধতির মতো কোডটি ভিতরে রাখেন তবে এটি কার্যকর হয়ে যায় (আমি চেষ্টা করেছি):

0. বর্ণনা (রফতানি)

আমি অনথিভুক্ত ব্যবহার করেন EXPORTHOW এবং DECLAREএকটি মডিউল কারণ আমি সঙ্গে একটি উপায় খুঁজে বের করা হয়নি Phaser । স্পষ্টতই এটি অনেকটা দেরি হয়ে গেছে এমনকি বিগিনেও।

আমি যে উদাহরণ দিচ্ছি তা হ'ল একটি পদ্ধতিতে (এমনকি 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.