7
votes

Puis-je capturer la valeur renvoyée d'une routine utilisée dans RUN-MAIN?

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?


0 commentaires

3 Réponses :


2
votes

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.


2 commentaires

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 :)



5
votes

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.


2 commentaires

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);



1
votes

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;


0 commentaires