사용자 지정 선언자 만들기


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)

나는 불법 사용하는 것이 EXPORTHOW 및 DECLAREA의 모듈 내가있는 방법을 발견하지 않았기 때문에 페이저를 . 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.