하는 데 도움이 논리를 분리. 이것은 기본적으로 문법을 제외하고는 다중 방법과 같은 생각입니다.
서브 클래스 문법은 이미 존재하는 것들의 측면을 따라 자사의 토큰을 추가 할 수 있도록 그것은 또한 그것을 만드는
grammar Mathemania {
token TOP { <cmd-list> }
token cmd-list { <cmd>+ }
token cmd { <op> <argument>? }
proto token op { * }
token op:sym<exp> { e } # notice that the name doesn't have to match
token op:sym<factorial> { f }
token op:sym<root> { r }
token op:sym<ceil> { c }
token op:sym<floor> { l }
token argument { '(' ~ ')' <cmd-list> }
}
class Calculate {
method TOP ($/) { make $<cmd-list>.made }
method argument ($/) { make $<cmd-list>.made }
method cmd-list ($/) {
my $result = 2;
$result = .made.($result).narrow for @<cmd>;
make $result;
}
method cmd ($/) {
if $<argument> {
make $<op>.made.assuming(*, $<argument>.made);
} else {
make $<op>.made;
}
}
method op:sym<exp> ($/) { make -> \n, \e = 2 { n ** e } }
method op:sym<factorial> ($/) { make -> \n, \k = 2 { [*] n, n - k + 1 ...^ 0 } }
method op:sym<root> ($/) { make -> \n, \r = 2 { n ** (1/r) } }
method op:sym<ceil> ($/) { make &ceiling }
method op:sym<floor> ($/) { make &floor }
}
(A Code Golf에 대한 답변을 평가하기위한 I wrote this)
및 하위 클래스 작업 클래스는 작업을 수행 할 수 있습니다 같은. 프로토과 멀티로 대안을 분할하는 (try it)
grammar Mathmania-Plus is Mathemania {
token op:sym<negate> { n }
token op:sym<abs> { a }
}
class Calculate-Plus is Calculate {
method op:sym<negate> ($/) { make &prefix:<-> }
method op:sym<abs> ($/) { make &abs }
}
아, 알겠습니다. 하지만 왜 액션 클래스의'sigil' 메소드가 호출되지 않았을까요? 저는 문법 밖에서 이것을 사용할 수 있습니다.하지만 저는 문법 안에서 그 문법을 생각해 보려고합니다. 내가 본 예는 복잡하지 않았거나화물 숭배였습니다. –