- est-ce qu'il y a une facon de stocker un nom de package dans
une variable et de changer de portee avec package $foo, autrement
que dans un eval "string";
Je me vois bien manipuler directement ma table de symboles pour y
poser ce que je veux, mais je prefererais pouvoir passer dans
un package directement.
L'application, en fait, ca serait d'avoir un fichier contenant quelques
methodes, et de pouvoir l'envelopper dans un package anonyme, a coups
de use Symbol;
L'acces se ferait alors a travers un objet cree dans le package.
- est-ce qu'il y a une facon de stocker un nom de package dans une variable et de changer de portee avec package $foo, autrement que dans un eval "string";
Je me vois bien manipuler directement ma table de symboles pour y poser ce que je veux, mais je prefererais pouvoir passer dans un package directement.
L'application, en fait, ca serait d'avoir un fichier contenant quelques methodes, et de pouvoir l'envelopper dans un package anonyme, a coups de use Symbol; L'acces se ferait alors a travers un objet cree dans le package.
package toto;
sub ok { print "ok" }
package tata;
sub ok { print "ko" }
package titi;
sub ok { print "kook" }
package main;
$ok = {}; for my $foo ( qw( toto tata titi ) ) { bless $ok, $foo; $ok->ok(); }
.s'nuoM
Bonjour,
Marc Espie wrote:
- est-ce qu'il y a une facon de stocker un nom de package dans
une variable et de changer de portee avec package $foo, autrement
que dans un eval "string";
Je me vois bien manipuler directement ma table de symboles pour y
poser ce que je veux, mais je prefererais pouvoir passer dans
un package directement.
L'application, en fait, ca serait d'avoir un fichier contenant quelques
methodes, et de pouvoir l'envelopper dans un package anonyme, a coups
de use Symbol;
L'acces se ferait alors a travers un objet cree dans le package.
package toto;
sub ok { print "ok" }
package tata;
sub ok { print "ko" }
package titi;
sub ok { print "kook" }
package main;
$ok = {};
for my $foo ( qw( toto tata titi ) ) {
bless $ok, $foo;
$ok->ok();
}
- est-ce qu'il y a une facon de stocker un nom de package dans une variable et de changer de portee avec package $foo, autrement que dans un eval "string";
Je me vois bien manipuler directement ma table de symboles pour y poser ce que je veux, mais je prefererais pouvoir passer dans un package directement.
L'application, en fait, ca serait d'avoir un fichier contenant quelques methodes, et de pouvoir l'envelopper dans un package anonyme, a coups de use Symbol; L'acces se ferait alors a travers un objet cree dans le package.
package toto;
sub ok { print "ok" }
package tata;
sub ok { print "ko" }
package titi;
sub ok { print "kook" }
package main;
$ok = {}; for my $foo ( qw( toto tata titi ) ) { bless $ok, $foo; $ok->ok(); }
.s'nuoM
Paul Gaborit
À (at) Mon, 23 Aug 2004 10:16:32 +0000 (UTC), (Marc Espie) écrivait (wrote):
- est-ce qu'il y a une facon de stocker un nom de package dans une variable et de changer de portee avec package $foo, autrement que dans un eval "string";
Je me vois bien manipuler directement ma table de symboles pour y poser ce que je veux, mais je prefererais pouvoir passer dans un package directement.
L'application, en fait, ca serait d'avoir un fichier contenant quelques methodes, et de pouvoir l'envelopper dans un package anonyme, a coups de use Symbol; L'acces se ferait alors a travers un objet cree dans le package.
Je n'ai pas compris votre question. Pourriez-vous donner un exemple du fonctionnement attendu ?
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Mon, 23 Aug 2004 10:16:32 +0000 (UTC),
espie@tetto.gentiane.org (Marc Espie) écrivait (wrote):
- est-ce qu'il y a une facon de stocker un nom de package dans
une variable et de changer de portee avec package $foo, autrement
que dans un eval "string";
Je me vois bien manipuler directement ma table de symboles pour y
poser ce que je veux, mais je prefererais pouvoir passer dans
un package directement.
L'application, en fait, ca serait d'avoir un fichier contenant quelques
methodes, et de pouvoir l'envelopper dans un package anonyme, a coups
de use Symbol;
L'acces se ferait alors a travers un objet cree dans le package.
Je n'ai pas compris votre question. Pourriez-vous donner un exemple du
fonctionnement attendu ?
--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Mon, 23 Aug 2004 10:16:32 +0000 (UTC), (Marc Espie) écrivait (wrote):
- est-ce qu'il y a une facon de stocker un nom de package dans une variable et de changer de portee avec package $foo, autrement que dans un eval "string";
Je me vois bien manipuler directement ma table de symboles pour y poser ce que je veux, mais je prefererais pouvoir passer dans un package directement.
L'application, en fait, ca serait d'avoir un fichier contenant quelques methodes, et de pouvoir l'envelopper dans un package anonyme, a coups de use Symbol; L'acces se ferait alors a travers un objet cree dans le package.
Je n'ai pas compris votre question. Pourriez-vous donner un exemple du fonctionnement attendu ?
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
espie
In article , Paul Gaborit <Paul.Gaborit+ wrote:
Je n'ai pas compris votre question. Pourriez-vous donner un exemple du fonctionnement attendu ?
J'ai un fichier qui contient
sub a { ... }
sub b { ... }
sub c { ... }
1;
j'aimerais bien pouvoir le charger, avec disons $r = myload("file");
Et pouvoir ensuite acceder a mes methodes avec $r->a(), $r->b(), $r->c().
En gros, il faudrait que a, b, c se retrouvent dans un package. Je me fiche du nom de celui-ci, sauf que je risque de charger plusieurs fichiers de ce genre, et donc qu'il faut eviter les collisions (par exemple, en generant le nom avec Symbol).
Pour l'instant, je n'ai pas de tres jolie solution, sans une demie-tonne d'eval "string"... ou sans copier le fichier ailleurs en rajoutant un package DADSAE45; en tete.
In article <r7657929j1.fsf@michelange.enstimac.fr>,
Paul Gaborit <Paul.Gaborit+news@enstimac.fr> wrote:
Je n'ai pas compris votre question. Pourriez-vous donner un exemple du
fonctionnement attendu ?
J'ai un fichier qui contient
sub a
{
...
}
sub b
{
...
}
sub c
{
...
}
1;
j'aimerais bien pouvoir le charger, avec disons
$r = myload("file");
Et pouvoir ensuite acceder a mes methodes avec
$r->a(), $r->b(), $r->c().
En gros, il faudrait que a, b, c se retrouvent dans un package. Je me
fiche du nom de celui-ci, sauf que je risque de charger plusieurs fichiers
de ce genre, et donc qu'il faut eviter les collisions (par exemple, en
generant le nom avec Symbol).
Pour l'instant, je n'ai pas de tres jolie solution, sans une demie-tonne
d'eval "string"... ou sans copier le fichier ailleurs en rajoutant
un package DADSAE45; en tete.
Je n'ai pas compris votre question. Pourriez-vous donner un exemple du fonctionnement attendu ?
J'ai un fichier qui contient
sub a { ... }
sub b { ... }
sub c { ... }
1;
j'aimerais bien pouvoir le charger, avec disons $r = myload("file");
Et pouvoir ensuite acceder a mes methodes avec $r->a(), $r->b(), $r->c().
En gros, il faudrait que a, b, c se retrouvent dans un package. Je me fiche du nom de celui-ci, sauf que je risque de charger plusieurs fichiers de ce genre, et donc qu'il faut eviter les collisions (par exemple, en generant le nom avec Symbol).
Pour l'instant, je n'ai pas de tres jolie solution, sans une demie-tonne d'eval "string"... ou sans copier le fichier ailleurs en rajoutant un package DADSAE45; en tete.
Paul Gaborit
À (at) Mon, 23 Aug 2004 16:33:14 +0000 (UTC), (Marc Espie) écrivait (wrote):
J'ai un fichier qui contient
sub a {...}
sub b {...}
sub c {...}
1;
j'aimerais bien pouvoir le charger, avec disons $r = myload("file");
Et pouvoir ensuite acceder a mes methodes avec $r->a(), $r->b(), $r->c().
En gros, il faudrait que a, b, c se retrouvent dans un package. Je me fiche du nom de celui-ci, sauf que je risque de charger plusieurs fichiers de ce genre, et donc qu'il faut eviter les collisions (par exemple, en generant le nom avec Symbol).
J'ai créé un petit package pour faire ce que voulez (je l'appelle DynGeneric):
sub add_methods { my $my_package = shift; my $obj_package = ref(shift); no strict 'refs'; push @{"${obj_package}::ISA"}, $my_package; } 1; ----------------------------------------
On place les trois subs dans un package (disons ABC) avec héritage de DynGeneric.
---------------------------------------- package ABC; use base qw{DynGeneric}; sub a {...} sub b {...} sub c {...} 1; ----------------------------------------
Puis dans votre programme :
---------------------------------------- use ABC;
# "Pack_r" est une chaîne arbitraire $r = bless {}, "Pack_r";
# pour ajouter les méthodes de ABC à $r ABC->add_methods($r);
# et ça marche... $r->a(); ----------------------------------------
On peut évidemment créer d'autres packages que ABC et les ajouter comme méthode de la classe de Pack_r. C'est de l'héritage dynamique ;-)
Cela correspond-il à votre besoin ?
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Mon, 23 Aug 2004 16:33:14 +0000 (UTC),
espie@tetto.gentiane.org (Marc Espie) écrivait (wrote):
J'ai un fichier qui contient
sub a {...}
sub b {...}
sub c {...}
1;
j'aimerais bien pouvoir le charger, avec disons
$r = myload("file");
Et pouvoir ensuite acceder a mes methodes avec
$r->a(), $r->b(), $r->c().
En gros, il faudrait que a, b, c se retrouvent dans un package. Je me
fiche du nom de celui-ci, sauf que je risque de charger plusieurs fichiers
de ce genre, et donc qu'il faut eviter les collisions (par exemple, en
generant le nom avec Symbol).
J'ai créé un petit package pour faire ce que voulez (je l'appelle DynGeneric):
sub add_methods {
my $my_package = shift;
my $obj_package = ref(shift);
no strict 'refs';
push @{"${obj_package}::ISA"}, $my_package;
}
1;
----------------------------------------
On place les trois subs dans un package (disons ABC) avec héritage de
DynGeneric.
----------------------------------------
package ABC;
use base qw{DynGeneric};
sub a {...}
sub b {...}
sub c {...}
1;
----------------------------------------
Puis dans votre programme :
----------------------------------------
use ABC;
# "Pack_r" est une chaîne arbitraire
$r = bless {}, "Pack_r";
# pour ajouter les méthodes de ABC à $r
ABC->add_methods($r);
# et ça marche...
$r->a();
----------------------------------------
On peut évidemment créer d'autres packages que ABC et les ajouter comme
méthode de la classe de Pack_r. C'est de l'héritage dynamique ;-)
Cela correspond-il à votre besoin ?
--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Mon, 23 Aug 2004 16:33:14 +0000 (UTC), (Marc Espie) écrivait (wrote):
J'ai un fichier qui contient
sub a {...}
sub b {...}
sub c {...}
1;
j'aimerais bien pouvoir le charger, avec disons $r = myload("file");
Et pouvoir ensuite acceder a mes methodes avec $r->a(), $r->b(), $r->c().
En gros, il faudrait que a, b, c se retrouvent dans un package. Je me fiche du nom de celui-ci, sauf que je risque de charger plusieurs fichiers de ce genre, et donc qu'il faut eviter les collisions (par exemple, en generant le nom avec Symbol).
J'ai créé un petit package pour faire ce que voulez (je l'appelle DynGeneric):
sub add_methods { my $my_package = shift; my $obj_package = ref(shift); no strict 'refs'; push @{"${obj_package}::ISA"}, $my_package; } 1; ----------------------------------------
On place les trois subs dans un package (disons ABC) avec héritage de DynGeneric.
---------------------------------------- package ABC; use base qw{DynGeneric}; sub a {...} sub b {...} sub c {...} 1; ----------------------------------------
Puis dans votre programme :
---------------------------------------- use ABC;
# "Pack_r" est une chaîne arbitraire $r = bless {}, "Pack_r";
# pour ajouter les méthodes de ABC à $r ABC->add_methods($r);
# et ça marche... $r->a(); ----------------------------------------
On peut évidemment créer d'autres packages que ABC et les ajouter comme méthode de la classe de Pack_r. C'est de l'héritage dynamique ;-)
Cela correspond-il à votre besoin ?
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
espie
In article , Paul Gaborit <Paul.Gaborit+ wrote:
On peut évidemment créer d'autres packages que ABC et les ajouter comme méthode de la classe de Pack_r. C'est de l'héritage dynamique ;-)
Cela correspond-il à votre besoin ?
Pas loin. Il reste un probleme de collisions: je n'ai pas de controle centralise sur les noms de packages, comme ABC, et j'aurais vraiment besoin d'un truc qui invente ces noms au vol, de facon a eviter les collisions.
In article <r7n00kzqc4.fsf@michelange.enstimac.fr>,
Paul Gaborit <Paul.Gaborit+news@enstimac.fr> wrote:
On peut évidemment créer d'autres packages que ABC et les ajouter comme
méthode de la classe de Pack_r. C'est de l'héritage dynamique ;-)
Cela correspond-il à votre besoin ?
Pas loin. Il reste un probleme de collisions: je n'ai pas de controle
centralise sur les noms de packages, comme ABC, et j'aurais vraiment
besoin d'un truc qui invente ces noms au vol, de facon a eviter les
collisions.
On peut évidemment créer d'autres packages que ABC et les ajouter comme méthode de la classe de Pack_r. C'est de l'héritage dynamique ;-)
Cela correspond-il à votre besoin ?
Pas loin. Il reste un probleme de collisions: je n'ai pas de controle centralise sur les noms de packages, comme ABC, et j'aurais vraiment besoin d'un truc qui invente ces noms au vol, de facon a eviter les collisions.
Paul Gaborit
À (at) Tue, 24 Aug 2004 12:27:24 +0000 (UTC), (Marc Espie) écrivait (wrote):
Pas loin. Il reste un probleme de collisions: je n'ai pas de controle centralise sur les noms de packages, comme ABC, et j'aurais vraiment besoin d'un truc qui invente ces noms au vol, de facon a eviter les collisions.
On peut se baser sur le nom du fichier pour générer le nom du package correpondant (c'est d'ailleurs implicite avec "use"). Ce que je ne comprends pas dans votre problème, c'est d'où viennent et comment sont fabriqués/nommés ces fichiers contenant a(), b(), c()... ? J'ai l'impression que c'est lors de leur création qu'il faut intervenir.
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Tue, 24 Aug 2004 12:27:24 +0000 (UTC),
espie@tetto.gentiane.org (Marc Espie) écrivait (wrote):
Pas loin. Il reste un probleme de collisions: je n'ai pas de controle
centralise sur les noms de packages, comme ABC, et j'aurais vraiment
besoin d'un truc qui invente ces noms au vol, de facon a eviter les
collisions.
On peut se baser sur le nom du fichier pour générer le nom du package
correpondant (c'est d'ailleurs implicite avec "use"). Ce que je ne comprends
pas dans votre problème, c'est d'où viennent et comment sont fabriqués/nommés
ces fichiers contenant a(), b(), c()... ? J'ai l'impression que c'est lors de
leur création qu'il faut intervenir.
--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Tue, 24 Aug 2004 12:27:24 +0000 (UTC), (Marc Espie) écrivait (wrote):
Pas loin. Il reste un probleme de collisions: je n'ai pas de controle centralise sur les noms de packages, comme ABC, et j'aurais vraiment besoin d'un truc qui invente ces noms au vol, de facon a eviter les collisions.
On peut se baser sur le nom du fichier pour générer le nom du package correpondant (c'est d'ailleurs implicite avec "use"). Ce que je ne comprends pas dans votre problème, c'est d'où viennent et comment sont fabriqués/nommés ces fichiers contenant a(), b(), c()... ? J'ai l'impression que c'est lors de leur création qu'il faut intervenir.
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
Laurent Wacrenier
Marc Espie écrit:
j'aimerais bien pouvoir le charger, avec disons $r = myload("file");
Et pouvoir ensuite acceder a mes methodes avec $r->a(), $r->b(), $r->c().
Quelque chose comme ça ?
sub myload($) { my $file = shift; my $hash; { package myload; do $file; } my $stash = *{myload::}{HASH}; while (($key,$value) = each %$stash) { $hash->{$key} = &$value if exists &$value; delete $stash->{$key}; } return $hash; }
Je ne suis pas sur que ce soit bien portable (ça tourne sur 5.8.0)
Marc Espie <espie@tetto.gentiane.org> écrit:
j'aimerais bien pouvoir le charger, avec disons
$r = myload("file");
Et pouvoir ensuite acceder a mes methodes avec
$r->a(), $r->b(), $r->c().
Quelque chose comme ça ?
sub myload($) {
my $file = shift;
my $hash;
{
package myload;
do $file;
}
my $stash = *{myload::}{HASH};
while (($key,$value) = each %$stash) {
$hash->{$key} = &$value if exists &$value;
delete $stash->{$key};
}
return $hash;
}
Je ne suis pas sur que ce soit bien portable (ça tourne sur 5.8.0)
j'aimerais bien pouvoir le charger, avec disons $r = myload("file");
Et pouvoir ensuite acceder a mes methodes avec $r->a(), $r->b(), $r->c().
Quelque chose comme ça ?
sub myload($) { my $file = shift; my $hash; { package myload; do $file; } my $stash = *{myload::}{HASH}; while (($key,$value) = each %$stash) { $hash->{$key} = &$value if exists &$value; delete $stash->{$key}; } return $hash; }
Je ne suis pas sur que ce soit bien portable (ça tourne sur 5.8.0)
Laurent Wacrenier
Marc Espie écrit:
L'application, en fait, ca serait d'avoir un fichier contenant quelques methodes, et de pouvoir l'envelopper dans un package anonyme, a coups de use Symbol;
Pourquoi ne pas écrire le module de cette manière ?
{ a => sub { ... }, b => sub { ... } };
et faire un
$r = do "fichier";
Marc Espie <espie@tetto.gentiane.org> écrit:
L'application, en fait, ca serait d'avoir un fichier contenant quelques
methodes, et de pouvoir l'envelopper dans un package anonyme, a coups
de use Symbol;
Pourquoi ne pas écrire le module de cette manière ?
L'application, en fait, ca serait d'avoir un fichier contenant quelques methodes, et de pouvoir l'envelopper dans un package anonyme, a coups de use Symbol;
Pourquoi ne pas écrire le module de cette manière ?
{ a => sub { ... }, b => sub { ... } };
et faire un
$r = do "fichier";
Paul Gaborit
À (at) Tue, 24 Aug 2004 13:24:18 +0000 (UTC), Laurent Wacrenier <lwa@ teaser . fr> écrivait (wrote):
Marc Espie écrit:
L'application, en fait, ca serait d'avoir un fichier contenant quelques methodes, et de pouvoir l'envelopper dans un package anonyme, a coups de use Symbol;
Pourquoi ne pas écrire le module de cette manière ?
{ a => sub { ... }, b => sub { ... } };
et faire un
$r = do "fichier";
Sauf que pour appeler un sub, il faudra écrire :
$r->{a}->(...);
au lieu de :
$r->a(...);
Mais ça peut effectivement répondre au besoin initial...
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Tue, 24 Aug 2004 13:24:18 +0000 (UTC),
Laurent Wacrenier <lwa@ teaser . fr> écrivait (wrote):
Marc Espie <espie@tetto.gentiane.org> écrit:
L'application, en fait, ca serait d'avoir un fichier contenant quelques
methodes, et de pouvoir l'envelopper dans un package anonyme, a coups
de use Symbol;
Pourquoi ne pas écrire le module de cette manière ?
{
a => sub { ... },
b => sub { ... }
};
et faire un
$r = do "fichier";
Sauf que pour appeler un sub, il faudra écrire :
$r->{a}->(...);
au lieu de :
$r->a(...);
Mais ça peut effectivement répondre au besoin initial...
--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Tue, 24 Aug 2004 13:24:18 +0000 (UTC), Laurent Wacrenier <lwa@ teaser . fr> écrivait (wrote):
Marc Espie écrit:
L'application, en fait, ca serait d'avoir un fichier contenant quelques methodes, et de pouvoir l'envelopper dans un package anonyme, a coups de use Symbol;
Pourquoi ne pas écrire le module de cette manière ?
{ a => sub { ... }, b => sub { ... } };
et faire un
$r = do "fichier";
Sauf que pour appeler un sub, il faudra écrire :
$r->{a}->(...);
au lieu de :
$r->a(...);
Mais ça peut effectivement répondre au besoin initial...
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
espie
In article , Paul Gaborit <Paul.Gaborit+ wrote:
À (at) Tue, 24 Aug 2004 12:27:24 +0000 (UTC), (Marc Espie) écrivait (wrote):
Pas loin. Il reste un probleme de collisions: je n'ai pas de controle centralise sur les noms de packages, comme ABC, et j'aurais vraiment besoin d'un truc qui invente ces noms au vol, de facon a eviter les collisions.
On peut se baser sur le nom du fichier pour générer le nom du package correpondant (c'est d'ailleurs implicite avec "use"). Ce que je ne comprends pas dans votre problème, c'est d'où viennent et comment sont fabriqués/nommés ces fichiers contenant a(), b(), c()... ? J'ai l'impression que c'est lors de leur création qu'il faut intervenir.
Le probleme, c'est que mes noms de fichiers vont avoir une tete aussi sympa que kdebase-3.1.3.pm ou screen-4.0rc3.pm... et c'est pas si evident que ca d'avoir un nom de package que perl accepte a partir de ca.
Les fichiers contenant a, b, c peuvent etre ecrits par diverses personnes. Moins je leur donne de conventions specifiques au systeme et plus ils peuvent ecrire du perl generique, mieux ils se portent.
D'ou une partie du probleme: transformer le fichier au vol, ca implique plus ou moins de se restreindre a un sous-ensemble du langage, ce que je n'ai aucune envie de faire a priori, cote design de l'ensemble.
en fait, ce qui me turlupine toujours autant, c'est pourquoi une construction comme package $foo; ne fonctionne pas.
Et, en general, pourquoi tant de restrictions sur les noms de packages et la facon de les employer en perl. Compare au reste du langage, qui est d'une grande souplesse, c'est assez surprenant. Et ca me surprend d'autant plus que mes desiderata ne me paraissent pas si compliques: on a des closure et des anonymous sub. Ce que je veux n'est jamais qu'une ou l'autre facon d'etendre ca pour pouvoir ecrire des anonymous class tranquille dans son coin.
In article <r76578zopd.fsf@michelange.enstimac.fr>,
Paul Gaborit <Paul.Gaborit+news@enstimac.fr> wrote:
À (at) Tue, 24 Aug 2004 12:27:24 +0000 (UTC),
espie@tetto.gentiane.org (Marc Espie) écrivait (wrote):
Pas loin. Il reste un probleme de collisions: je n'ai pas de controle
centralise sur les noms de packages, comme ABC, et j'aurais vraiment
besoin d'un truc qui invente ces noms au vol, de facon a eviter les
collisions.
On peut se baser sur le nom du fichier pour générer le nom du package
correpondant (c'est d'ailleurs implicite avec "use"). Ce que je ne comprends
pas dans votre problème, c'est d'où viennent et comment sont fabriqués/nommés
ces fichiers contenant a(), b(), c()... ? J'ai l'impression que c'est lors de
leur création qu'il faut intervenir.
Le probleme, c'est que mes noms de fichiers vont avoir une tete aussi
sympa que kdebase-3.1.3.pm ou screen-4.0rc3.pm... et c'est pas si evident
que ca d'avoir un nom de package que perl accepte a partir de ca.
Les fichiers contenant a, b, c peuvent etre ecrits par diverses personnes.
Moins je leur donne de conventions specifiques au systeme et plus ils peuvent
ecrire du perl generique, mieux ils se portent.
D'ou une partie du probleme: transformer le fichier au vol, ca implique
plus ou moins de se restreindre a un sous-ensemble du langage, ce que je
n'ai aucune envie de faire a priori, cote design de l'ensemble.
en fait, ce qui me turlupine toujours autant, c'est pourquoi une
construction comme
package $foo;
ne fonctionne pas.
Et, en general, pourquoi tant de restrictions sur les noms de packages et
la facon de les employer en perl. Compare au reste du langage, qui est
d'une grande souplesse, c'est assez surprenant. Et ca me surprend d'autant
plus que mes desiderata ne me paraissent pas si compliques: on a des
closure et des anonymous sub. Ce que je veux n'est jamais qu'une ou l'autre
facon d'etendre ca pour pouvoir ecrire des anonymous class tranquille dans
son coin.
À (at) Tue, 24 Aug 2004 12:27:24 +0000 (UTC), (Marc Espie) écrivait (wrote):
Pas loin. Il reste un probleme de collisions: je n'ai pas de controle centralise sur les noms de packages, comme ABC, et j'aurais vraiment besoin d'un truc qui invente ces noms au vol, de facon a eviter les collisions.
On peut se baser sur le nom du fichier pour générer le nom du package correpondant (c'est d'ailleurs implicite avec "use"). Ce que je ne comprends pas dans votre problème, c'est d'où viennent et comment sont fabriqués/nommés ces fichiers contenant a(), b(), c()... ? J'ai l'impression que c'est lors de leur création qu'il faut intervenir.
Le probleme, c'est que mes noms de fichiers vont avoir une tete aussi sympa que kdebase-3.1.3.pm ou screen-4.0rc3.pm... et c'est pas si evident que ca d'avoir un nom de package que perl accepte a partir de ca.
Les fichiers contenant a, b, c peuvent etre ecrits par diverses personnes. Moins je leur donne de conventions specifiques au systeme et plus ils peuvent ecrire du perl generique, mieux ils se portent.
D'ou une partie du probleme: transformer le fichier au vol, ca implique plus ou moins de se restreindre a un sous-ensemble du langage, ce que je n'ai aucune envie de faire a priori, cote design de l'ensemble.
en fait, ce qui me turlupine toujours autant, c'est pourquoi une construction comme package $foo; ne fonctionne pas.
Et, en general, pourquoi tant de restrictions sur les noms de packages et la facon de les employer en perl. Compare au reste du langage, qui est d'une grande souplesse, c'est assez surprenant. Et ca me surprend d'autant plus que mes desiderata ne me paraissent pas si compliques: on a des closure et des anonymous sub. Ce que je veux n'est jamais qu'une ou l'autre facon d'etendre ca pour pouvoir ecrire des anonymous class tranquille dans son coin.