일부 부품으로 도면 패키지를 작성하고 있으며 연산자와 데이터 유형이 흩어져 있습니다. 그러나 사용자가 매번 해당 모듈을 추가하는 것을 원하지 않습니다. 예를 들어, Point
클래스, Monoid
역할 및 Style
클래스가 다른 경로에 있기 때문에 상당히 지저분 합니다.
unit module Package::Data::Monoid;
# $?FILE = lib/Package/Data/Monoid.pm6
role Monoid {...}
unit module Package::Data::Point;
# $?FILE = lib/Package/Data/Point.pm6
class Point {...}
unit module Package::Data::Style;
# $?FILE = lib/Package/Data/Style.pm6
class Style {...}
나는
그런 스크립트를 쓸 수있는 효과와 haskell
같은 서곡 을 갖고 싶다lib/Package/Prelude.pm6
use Package::Prelude;
# I can use Point right away, Style etc...
대신에
use Package::Data::Style;
use Package::Data::Point;
use Package::Data::Monoid;
# I can too use point right away, but for users not knowing the
# inner workings it's too overwhelming
나는 많은 것을 시도했다.
- 이 버전은 나에게 올바른 효과를 제공하지 않습니다. 나는 가리킬 전체 경로를 입력해야합니다
Package::Data::Point
.
unit module Package::Prelude;
# $?FILE = lib/Package/Prelude.pm6
use Package::Data::Style;
use Package::Data::Point;
use Package::Data::Monoid;
- 이 버전은
Point
바로 나에게 제공 하지만 연산자와 관련된 문제가 발생합니다. 또한 언급 된 예제 패키지의 내 보낸 루틴의 모든 것을 자동으로 추가하고 싶습니다.
# $?FILE = lib/Package/Prelude.pm6
use Package::Data::Style;
use Package::Data::Point;
use Package::Data::Monoid;
sub EXPORT {
hash <Point> => Point
, <Style> => Style
, <mappend> => &mappend
...
}
당신은 사람들이 그런 전주곡 같은 파일을 얻는 더 좋고 빠른 방법을 알고 있습니까?
답변
사용 EXPORT
은 올바른 방향입니다. 알아야 할 주요 사항은 다음과 같습니다.
- 수입은 어휘
- 내부 어휘를 사용하여 현재 어휘 범위의 기호를 얻고 액세스 할 수 있습니다
레시피는 다음과 같습니다.
use
내부의 모든 모듈EXPORT
- 그런 다음 가져온 모든 심볼을 추출하여 결과로 반환하십시오.
EXPORT
예를 들어 Foo::Point
연산자와 클래스를 포함하여 모듈을 만듭니다 .
unit module Foo::Point;
class Point is export {
has ($.x, $.y);
}
multi infix:<+>(Point $a, Point $b) is export {
Point.new(x => $a.x + $b.x, y => $a.y + $b.y)
}
그리고 여러 모듈과 함께 작동 할 수 있음을 보여주기 위해 Foo::Monad
:
unit module Foo::Monad;
class Monad is export {
method explain() { say "Just think of a burrito..." }
}
목표는이 작업을 수행하는 것입니다.
use Foo::Prelude;
say Point.new(x => 2, y => 4) + Point.new(x => 3, y => 5);
Monad.explain;
다음 Foo::Prelude
을 포함 하는를 작성하면 얻을 수 있습니다 .
sub EXPORT() {
{
use Foo::Point;
use Foo::Monad;
return ::.pairs.grep(*.key ne '$_').Map;
}
}
여기에 설명 할 몇 가지 이상한 점이 있습니다.
- A는
sub
암시 적 선언을 가지고$_
,$/
하고$!
. 이를 내 보내면 모듈이use
‘d 일 때 컴파일 타임 심볼 충돌 오류가 발생합니다 . 블록에는 암시 적 만 있습니다$_
. 따라서 우리는 중첩 된 베어 블록으로 우리의 삶을 더 쉽게 만듭니다. - 이것은
grep
우리가 암시 적으로 선언 한$_
심볼을 내 보내지 않도록하는 것 입니다. ::
현재 범위를 참조하는 방법입니다 (용어 :::
패키지 구분 기호입니다).::.pairs
따라서Pair
현재 범위의 각 심볼에 대한 객체를 얻습니다 .
향후 라쿠 언어 릴리스에 나타날 수있는 추측 된 재수출 메커니즘이 있습니다.