|
|
Up |
|
|
  |
Author: Olivier CroquetteOlivier Croquette Date: Feb 28, 2008 09:49
Salut à tous
J'en suis encore à mes débuts en Perl, et j'ai le problème suivant: je
veux écrire sous forme de modules plusieurs implémentations d'une même
interface.
Le but est de décider à la compilation (par exemple en fonction d'une
variable d'environnement) de quelle implémentation utiliser.
Bref, j'ai:
main.pl
module.pm
module_imp1.pm
module_imp2.pm
main est censé faire un "use module", qui "redirigerait" vers
l'implémentation correcte.
Bien sûr, je veux éviter d'avoir à écrire quoique soit dans module.pm
(surtout pas une fonction par fonction à transférer).
J'ai essayé de faire ça à base de ISA et Exporter, mais je ne suis
arrivé à rien, et je ne suis pas sûr d'être sur la bonne piste.
Des idées peut-être?
Merci!
|
| |
|
| | 6 Comments |
|
  |
Author: Jean-Louis MORELJean-Louis MOREL Date: Feb 28, 2008 14:38
Dans l'article news.t-online.com>,
ocroquette@ocroquette.free.fr a dit...
>
>J'en suis encore à mes débuts en Perl, et j'ai le problème suivant: je
>veux écrire sous forme de modules plusieurs implémentations d'une même
>interface.
>Le but est de décider à la compilation (par exemple en fonction d'une
>variable d'environnement) de quelle implémentation utiliser.
>
>Bref, j'ai:
>
>main.pl
>module.pm
>module_imp1.pm
>module_imp2.pm
>
>main est censé faire un "use module", qui "redirigerait" vers
>l'implémentation correcte.
>Bien sûr, je veux éviter d'avoir à écrire quoique soit dans module.pm
>(surtout pas une fonction par fonction à transférer). ...
|
| Show full article (1.36Kb) |
|
| | no comments |
|
  |
Author: ocroquetteocroquette Date: Feb 29, 2008 01:34
On Feb 28, 11:38 pm, jl_mo...@ bribes.org (Jean-Louis MOREL) wrote:
> Peut être mettre dans module.pm (si j'ai bien compris la question)
>
> if ( CONDITION ) {
> require module_imp1;}
> else {
> require module_imp2;
> }
OK, mais le problème est de faire en sorte que:
use module;
f();
appelle la fonction correspondante de l'implementation, et ce
automatiquement, avec le moins de code possible.
J'ai trouve une solution a base de ISA:
package module_imp1;
sub foo {
print("Inside module_imp1::foo\n");
}
|
| Show full article (0.77Kb) |
| no comments |
|
  |
Author: ocroquetteocroquette Date: Feb 29, 2008 01:44
On Feb 29, 10:34 am, ocroque...@free.fr wrote:
> C'est exactement ce que je veux faire, néanmoins cela oblige Ã
> utiliser une syntaxe "objet" (->) alors que je travaille sur un
> programme complètement orienté fonctions. :(
Une autre solution, basée sur AUTOLOAD et la recherche dynamique de
fonction cette fois:
package module_imp1;
use strict;
sub foo {
print("Inside module_imp1::foo\n");
}
package module;
|
| Show full article (0.81Kb) |
| no comments |
|
  |
Author: Paul GaboritPaul Gaborit Date: Feb 29, 2008 03:08
À (at) Fri, 29 Feb 2008 01:34:04 -0800 (PST),
ocroquette@free.fr écrivait (wrote):
> OK, mais le problème est de faire en sorte que:
> use module;
> f();
> appelle la fonction correspondante de l'implementation, et ce
> automatiquement, avec le moins de code possible.
C'est un problème d'import/export de fonctions(). Il suffit que chaque
implémentation exporte correctement les fonctions voulues (via
Exporter).
Ensuite le package 'Module' peut faire :
----------------------------------------
package Module;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK;
our @EXPORT;
|
| Show full article (1.08Kb) |
| no comments |
|
  |
Author: Jean-Louis MORELJean-Louis MOREL Date: Feb 29, 2008 03:10
>
>On Feb 28, 11:38 pm, jl_mo...@ bribes.org (Jean-Louis MOREL) wrote:
>> Peut =EAtre mettre dans module.pm (si j'ai bien compris la question)
>>
>> if ( CONDITION ) {
>> require module_imp1;}
>> else {
>> require module_imp2;
>> }
>
>OK, mais le probl=E8me est de faire en sorte que:
>use module;
>f();
>appelle la fonction correspondante de l'implementation, et ce
>automatiquement, avec le moins de code possible.
>
>J'ai trouve une solution a base de ISA:
> ...
|
| Show full article (1.82Kb) |
| no comments |
|
  |
|
|
  |
Author: Olivier CroquetteOlivier Croquette Date: Feb 29, 2008 14:52
Jean-Louis MOREL wrote, On 29/02/08 12:10:
> if ($imp) {
> require module_imp1;
> module_imp1->import();
> }
> else {
> require module_imp2;
> module_imp2->import();
> }
Super, c'est exactement ça que je m'imaginais.
Il me manquait juste le import. Je n'aurais pas imaginer qu'on puisse
injecter les symboles d'un paquet dans un autre aussi facilement.
|
| |
| no comments |
|
|
|
|