J'écris un package de dessin avec certaines parties et j'ai des opérateurs et des types de données dispersés. Cependant, je ne veux pas que les utilisateurs ajoutent les modules correspondants à chaque fois, car ce serait assez compliqué, par exemple, j'aurais une Point
classe, un Monoid
rôle et une Style
classe dans des chemins différents comme celui-ci
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 {...}
Je voudrais avoir un haskell
prélude similaire lib/Package/Prelude.pm6
avec l'effet que je peux écrire de tels scripts
use Package::Prelude;
# I can use Point right away, Style etc...
au lieu de faire
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
J'ai essayé beaucoup de choses:
- Cette version ne me donne pas le bon effet, je dois taper tout le chemin à pointer, c'est à dire
Package::Data::Point
...
unit module Package::Prelude;
# $?FILE = lib/Package/Prelude.pm6
use Package::Data::Style;
use Package::Data::Point;
use Package::Data::Monoid;
- Cette version me donne
Point
tout de suite, mais j'ai des problèmes avec les opérateurs et ainsi de suite, je voudrais également ajouter automatiquement tout ce qui provient des routines exportées dans les exemples de packages mentionnés.
# $?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
...
}
Connaissez-vous un moyen meilleur et plus rapide d'obtenir un tel fichier prélude?
unit class Package::Data::Point
. Vous n'avez pas à utilisermodule
.Réponses:
L'utilisation
EXPORT
est dans la bonne direction. Les choses clés à savoir sont:La recette est donc:
use
tous les modules à l'intérieur deEXPORT
EXPORT
À titre d'exemple, je crée un module
Foo::Point
, comprenant un opérateur et une classe:Et, juste pour démontrer qu'il peut fonctionner avec plusieurs modules, également
Foo::Monad
:Le but est de faire fonctionner cela:
Ce qui peut être réalisé en écrivant un
Foo::Prelude
qui contient:Il y a quelques bizarreries ici pour expliquer:
sub
a des déclarations implicites$_
,$/
et$!
. L'exportation de ceux-ci entraînerait une erreur de conflit de symboles au moment de la compilation lorsque le module estuse
'd. Un bloc n'a qu'un implicite$_
. Ainsi, nous facilitons notre vie avec un bloc nu imbriqué.grep
s'agit de s'assurer que nous n'exportons pas notre$_
symbole implicitement déclaré (grâce au bloc imbriqué, c'est le seul dont nous devons nous soucier).::
est un moyen de référencer la portée actuelle (étymologie:::
est le séparateur de paquet).::.pairs
obtient ainsi desPair
objets pour chaque symbole dans la portée actuelle.Il existe un mécanisme de réexportation spéculé qui pourrait apparaître dans une future version en langue Raku qui éliminerait le besoin de ce morceau de passe-partout.
la source