사용자 지정 선언자 만들기


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

그리고 Bar의 어딘가에 bar에 대한 선언을 설정하십시오 (또는 Foo 클래스 자체가 궁극적으로 자체 선언자를 사용하기 때문에 다른 곳으로 갈 수 있으며 별도의 유형으로 가져올 필요가 없습니다). 어떻게하면 되나요?


나는 이것이 기본적으로 "어떻게 어떻게해야합니까?" 그러나 나는 실제 쓰기를 보지 못했고 그것을 사용하는 현존하는 모듈 (Red / Cro)은 한 눈에 따라보기 어려운 상당히 복잡한 (아름다운 경우) 짐승입니다.
user0721090601

서명을 재사용하고 싶은 것 같습니다.
jjmerelo

2
jjmerelo : 아니요, 실제로 궁극적 인 목표는 메소드 서브 클래스 (내부에서 사용되는 경우 클래스에 등록)를 수행하고 코드 블록 내에서 완전히 다른 언어를 사용하는 것입니다 (이 경우 정규식과 유사한 언어)
user0721090601

2
jjmerelo : 제안에 대해서는 gist.github.com/alabamenhu/2fec7a8f51a24091dc1b104a2ae2f04d 를 참조하십시오 . 나는 며칠 떨어져서 보여줄 테스트 모듈을 가지고 있지만 Binex가 작동하는 대부분의 물류를 가지고 있지만 Raku와 같은 구문을 위해
user0721090601

답변:


5

-1. 제한 사항 (패키지에만 해당)

메소드 EXPORTHOW의 호출은 .set_how 전류에 $?LANG후자 속어를 추가.
그런 다음 add_package_declarator 에 메소드를 조치 및 문법에 MAIN $?LANG추가합니다 package_declarator. 내 생각에 유일하게 "동적 속어"(World.nqp)입니다.

원하는 경우 routine_declarator 를 덮어 씁니다 . 그런 다음 방금 인용 한 체인을 모방 한 속어를 작성해야합니다. 메소드 키워드를 유지하고 클래스에서 자동 서명을 작성하고 메소드 이름에 따라 말하면 다음과 같은 방법이 있습니다.

참고 : 패키지는 컨테이너 (패키지, 문법, 모듈, 역할, 노하우, 열거 형, 클래스, 하위 집합)입니다. 메소드처럼 코드를 넣으면 실행됩니다 (방금 시도했습니다).

0. 설명 (EXPORTHOW)

나는 불법 사용하는 것이 EXPORTHOWDECLAREA의 모듈 내가있는 방법을 발견하지 않았기 때문에 페이저를 . BEGIN에서도 너무 늦었습니다.

내가 제공하는 예제는 클래스의 모든 메소드를 꾸미는 것입니다 (짝수 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. 실행 가능

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.