Je veux qu'un script exécute un sous-programme exporté à partir d'un module, avec le sous exporté à exécuter en tant que MAIN dans le script. Le sous-programme fait tout ce que je veux, sauf qu'il renvoie le résultat au lieu de l'imprimer.
RUN-MAIN semble atteindre la plupart de ce que je vise, mais je ne sais pas comment saisir la valeur renvoyée de la routine.
Existe-t-il un moyen de capturer la sortie de la routine donnée à RUN-MAIN à imprimer? RUN-MAIN est-il la bonne approche pour ce genre de choses?
3 Réponses :
Ce qui suit semble accomplir ce que je voulais (où foo
est le sous-cible).
RUN-MAIN( &foo, Nil ); sub MAIN ( |c --> Nil ) { foo(|c).say; }
EDIT: Malheureusement, cette solution n'est pas idéale, car elle s'exécute & foo deux fois.
Ce n'est pas une faute de frappe. Le premier |c
est un paramètre de Capture, et le préfixe |
est d'en faire un Slip. Cela n'a pas tout à fait fonctionné comme je m'y attendais, même si je dois me rappeler pourquoi, et si c'est exactement ceci ou quelque chose d'autre qui a causé mon problème (IIRC j'ai exécuté MAIN deux fois d'une manière ou d'une autre, une fois avec et une fois sans say
). Après avoir joué un peu, c'est le résultat final que j'ai trouvé: github.com/manwar/perlweeklychallenge-club/blob/master / ...
Il semble que j'ai mal compris la documentation, donc oui, le tuyau supplémentaire est en fait une faute de frappe :)
Vous pouvez utiliser l’opérateur de composition de fonctioninfix:<∘>
ou infix:<o>
sub foo ($name, Int $n=1) { "Hello $name\n" xx $n }; say &foo.signature; say (&foo Ro &say).signature;
mais malheureusement, cela change la signature
sub foo ($name, Int $n=1) { "Hello $name\n" xx $n }; RUN-MAIN &say o &foo, Nil; #or &foo Ro &say
donc le message USAGE
par défaut ne fonctionne pas.
Le manque d'USAGE est en effet regrettable, mais infixe: <∘> est une bonne idée! Je vais jouer avec.
Je joue avec ce qui suit qui semble faire ce que je veux jusqu'ici: notre & MAIN = & say ∘ & foo; RUN-MAIN (& foo, Nil);
Redispatch peut être utilisé dans une routine enveloppée pour appeler l'original. say
peut alors être utilisé sur le résultat du réacheminement dans l'enveloppe. Cela générera également une utilisation à partir de la routine d'origine.
Usage: filename.raku <input> <input> The data we want
$ raku filename.raku
sub foo ( $input #= The data we want ) { return $input; } &foo.wrap( sub (|) { callsame.say } ); RUN-MAIN &foo, Nil;