Existe-t-il un moyen de redéclarer un symbole en toute sécurité?


9

Je me retrouve souvent à expérimenter dans le REPL et je dirai quelque chose comme:

subset Bar of Int where * %% 57;

Ensuite, je joue un peu avec les vérifications de l' Barétat des choses.

Tout est heureux, jusqu'à ce que je réalise que je veux changer la définition de Bar.

Si je redéfinis Bar, je reçois une Redeclaration of symbolexception.

J'ai essayé d'utiliser MONKEY-TYPINGet augmentcomme ça:

use MONKEY-TYPING;
augment subset Bar of Int where * %% 37;

Mais cela m'a fait la même erreur.

Pourquoi je veux ça? Je peux donc itérer sur mes définitions de sous-ensemble (ou classe, ou autre symbole), tout en réutilisant les tests que j'ai déjà tapés et qui sont dans mon histoire.

Réponses:


3

Je pense que le REPL fait une partie de sa magie en EVALutilisant chaque nouvelle entrée dans une nouvelle portée lexicale imbriquée. Donc, si vous déclarez des choses avec, myvous pouvez les masquer avec des déclarations entrées plus tard:

my subset Bar of Int where * %% 57;
sub take-Bar(Bar $n) { say "$n is Bar" }
take-Bar 57;

my subset Bar of Int where * %% 42;
sub take-Bar(Bar $n) { say "$n is Bar" }
take-Bar 42;

Si vous omettez my, alors les déclarations for subsetet seront utilisées, et puisque c'est en fait + l'ajout du symbole au package englobant ...; s'avère que si vous supprimez le symbole du package, vous pouvez ensuite le masquer plus tard:classourourmy

subset Bar of Int where * %% 57;
GLOBAL::<Bar>:delete;
subset Bar of Int where * %% 42;
42 ~~ Bar;

REMARQUE: Ces résultats proviennent uniquement de mes expériences dans le REPL. Je ne sais pas s'il y a d'autres effets secondaires inconnus.


8

Le REPLa ses défauts. Il s'agit d'une construction élaborée de EVALdéclarations qui tentent de travailler ensemble. Parfois, cela ne fonctionne pas.

Je suppose que le mieux que nous puissions faire est d'introduire une commande REPL qui lui ferait oublier tout ce qu'elle a fait auparavant. Patches bienvenus! :-)


Donc, si je comprends bien, j'étais sur la bonne voie avec use MONKEY-TYPINGet augmentmais ils ne fonctionnent pas correctement dans le REPL (encore?) Car il a besoin de beaucoup de magie et de bande de canard.
daotoad

1
AFAIK, vous ne pouvez utiliser l'augmentation que pour ajouter des éléments à une classe. Ce que vous essayez de faire, c'est de remplacer un sous - ensemble .
Elizabeth Mattijsen

1
@daotoad Pour remplacer, vous pouvez utiliser supersede, mais je crois qu'à l'heure actuelle cela reste non implémenté.
user0721090601

1
Supersede n'est toujours pas implémenté, mais cela ne fonctionnerait de toute façon qu'au niveau d'un module installé. La fonction de remplacement doit permettre à un module d'indiquer qu'il doit être chargé à la place d'un autre module / version. C'est donc un indice pour le CompUnitRepo lorsqu'on lui demande s'il peut fournir un module donné.
Elizabeth Mattijsen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.