¿Hay alguna manera de redeclarar un símbolo de manera segura?

9

A menudo me encuentro experimentando en el REPL y diré algo como:

subset Bar of Int where * %% 57;

Luego juego un poco con los controles de la Barcapacidad de las cosas.

Todo es feliz, hasta que me doy cuenta de que quiero cambiar la definición de Bar.

Si acabo de redefinir Bar, obtengo una Redeclaration of symbolexcepción.

Intenté usar MONKEY-TYPINGy augmentasí:

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

Pero eso me dio el mismo error.

¿Por qué quiero esto? Así que puedo iterar en las definiciones de mi subconjunto (o clase u otro símbolo), mientras reutilizo las pruebas que ya he escrito que están en mi historial.

daotoad
fuente

Respuestas:

3

Creo que REPL hace parte de su magia al EVALunir cada nueva entrada en un nuevo ámbito léxico anidado. Entonces, si declara cosas con my, puede sombrearlas con declaraciones ingresadas más tarde:

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 omite my, se utilizarán for subsety classdeclaraciones, oury dado ourque en realidad es my+ agregar el símbolo al paquete adjunto ...; Resulta que si elimina el símbolo del paquete, puede sombrearlo nuevamente más tarde:

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

NOTA: Estos resultados son solo de mis experimentos en REPL. No estoy seguro de si hay otros efectos secundarios desconocidos.

cowbaymoo
fuente
8

El REPLtiene sus defectos. Es una construcción elaborada de EVALdeclaraciones que intentan trabajar juntas. A veces eso no funciona.

Supongo que lo mejor que podemos hacer es introducir un comando REPL que lo haga olvidar todo lo que ha hecho antes. ¡Parches bienvenidos! :-)

Elizabeth Mattijsen
fuente
Entonces, si entiendo correctamente, estaba en el camino correcto con use MONKEY-TYPINGy augmentpero no funcionan correctamente en el REPL (¿todavía?) Porque necesita mucha magia y cinta adhesiva.
Daotoad
1
AFAIK, solo puedes usar aumentar para agregar cosas a una clase. Lo que intenta hacer es reemplazar un subconjunto .
Elizabeth Mattijsen el
1
@daotoad Para reemplazar, puede usar supersede, pero creo que en la actualidad eso no está implementado.
user0721090601
1
Sustituir aún no está implementado, pero de todos modos eso solo funcionaría en un nivel de módulo instalado. La función de reemplazo debe permitir que un módulo indique que debe cargarse en lugar de otro módulo / versión. Por lo tanto, es una pista para CompUnitRepo cuando se le pregunta si puede proporcionar un módulo determinado.
Elizabeth Mattijsen