역할로 표현 복잡한 문법의 시리즈를 상상해 :Perl 6은 다른 출처에서 동일한 역할을 포함시킬 수 있습니까? 이 간단한 예제가 충돌을 보여주기 충분하지만
role Alpha {
token alpha { :i <[A..Z]> }
}
role Digit {
token digit { <[0..9]> }
}
role Either
does Alpha
does Digit {
token either { <alpha> | <digit> }
}
grammar Thingy
does Either
does Alpha
{
token TOP { <alpha> <either>* }
}
my $match = Thingy.parse('1a3');
dd $match;
펄 (6)가 충돌 것을 알아낼 관계를 수습하지 않기 때문에이 작동하지 않습니다 동일한 소스에서 같은 일이 실제로 :
는 0123를 읽고, 여러 역할
에 존재하지만 때문에 방법 '알파'클래스 꼬추으로 해결해야, 참조 :
는 그 클래스역할은 클래스에서 상속되지 않지만 다른 역할로 구성 될 수 있습니다. 그러나이 "crony"구성은 수업 구성 시간까지 평가되지 않습니다. 즉, 두 가지 역할이 동일한 역할을한다면, 충돌은 없습니다. 마치 클래스가 자신의 역할을 끌어 당기고 역할이 수행하지 않은 것처럼 말입니다. 역할은 설립 방법에 관계없이 결코 충돌 할 수 없습니다.
Thingy
는
Alpha
은 두 개의 서로 다른 부분에 포함되어 있는지 풀다 수있을 것입니다 수 있도록 역할, 가능한 늦게 적용되는 것을 의미 읽어 보시기 바랍니다. 이것은 최종 클래스를 구성하는 모든 역할 목록을 작성한 다음 최종 클래스에만 해당 목록을 적용하는 것과 같이 작동 할 것이라고 생각했습니다. 그런 식으로
Either
과 같은 것은 정의한 것만 섞어서 나중에 합성하여
Alpha
을 가져올 것입니다.
다양한 (IETF) RFC에 대한 문법을 구현할 때이 문제가 발생했습니다. 많은 사람들이 다른 RFC의 문법을 참조하기 때문에 Perl 6이 C3에 의한 상속을 해결할 수 없습니다. 그래서 저는 역할이 관계를 끊을 것이라고 생각했습니다. 분명히 그렇지 않습니다.
문법에 특별히 영향을 미치는 것이 있습니까? 다음은 똑같은 (그리고 예상대로) 실패합니다 :'perl6 -e 'role Foo {method bar {}}; 역할 Baz {방법 모음 {}}; class My :: Grammar {또한 Foo를 수행합니다. 바즈도 그렇다. } '' 그렇지 않으면 물론 스스로 해결할 수 있습니다 (역할에 대한 문서에서 언급 됨) :'token 호스트 {$ = <문법 :: IETF :: URI :: RFC3986 :: 호스트> [ ' : '<.port>]? }' –
ugexe
문법에 근본적으로 특이한 것은 아니지만 문법의 여러 부분에 나타날 수있는 명명 된 규칙에 대해서는 훨씬 더 유용합니다. 나는 문법이 거대 할 때 거대한 엉망이기 때문에 나 자신을 해결하지 않을 것입니다. –
제목의 질문에 대한 대답은 "그렇습니다."입니다. –