Piszę pakiet rysunków z niektórymi częściami, a operatorzy i typy danych są rozproszone po całej. Jednak nie chcę, aby użytkownicy dodawali odpowiednie moduły za każdym razem, ponieważ byłoby to dość bałagan, na przykład miałbym Point
klasę, Monoid
rolę i Style
klasę na różnych ścieżkach, takich jak ten
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 {...}
Chciałbym mieć haskell
podobne preludium lib/Package/Prelude.pm6
z efektem, że mogę pisać takie skrypty
use Package::Prelude;
# I can use Point right away, Style etc...
zamiast robić
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
Próbowałem wielu rzeczy:
- Ta wersja nie daje mi właściwego efektu, muszę wpisać całą ścieżkę do punktu, tj.
Package::Data::Point
...
unit module Package::Prelude;
# $?FILE = lib/Package/Prelude.pm6
use Package::Data::Style;
use Package::Data::Point;
use Package::Data::Monoid;
- Ta wersja daje mi od
Point
razu, ale mam problemy z operatorami i tak dalej, chciałbym również automatycznie dodać wszystko z eksportowanych procedur we wspomnianych przykładowych pakietach.
# $?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
...
}
Czy wy, ludzie, znacie lepszy i szybki sposób na uzyskanie takiego pliku przypominającego preludium?
unit class Package::Data::Point
. Nie musisz używaćmodule
.Odpowiedzi:
Korzystanie
EXPORT
jest w dobrym kierunku. Najważniejsze rzeczy, które należy wiedzieć:Przepis jest następujący:
use
wszystkie moduły wewnątrzEXPORT
EXPORT
Jako przykład tworzę moduł
Foo::Point
zawierający operator i klasę:I tylko w celu zademonstrowania, że może współpracować z wieloma modułami, a także
Foo::Monad
:Celem jest, aby to działało:
Co można osiągnąć, pisząc,
Foo::Prelude
że zawiera:Można tu wyjaśnić kilka osobliwości:
sub
Ma ukryte oświadczeń$_
,$/
oraz$!
. Wyeksportowanie ich spowoduje błąd kolizji symbolu podczas kompilacji, gdy moduł ma wartośćuse
d. Blok ma tylko domniemanie$_
. W ten sposób ułatwiamy nasze życie za pomocą zagnieżdżonego pustego bloku.grep
to na celu upewnienie się, że nie eksportujemy naszego niejawnie zadeklarowanego$_
symbolu (dzięki zagnieżdżonemu blokowi jest to jedyny, na którym musimy się przejmować).::
jest sposobem na odniesienie do bieżącego zakresu (etymologia:::
jest separatorem pakietów).::.pairs
w ten sposób uzyskujePair
obiekty dla każdego symbolu w bieżącym zakresie.Istnieje spekulowany mechanizm reeksportu, który może pojawić się w przyszłej wersji językowej Raku, który wyeliminowałby potrzebę korzystania z tego fragmentu.
źródło