C'è un modo per dichiarare in modo sicuro un simbolo?


9

Mi trovo spesso a sperimentare nel REPL e dirò qualcosa del tipo:

subset Bar of Int where * %% 57;

Poi gioco Barun po ' con i controlli sul -ness per le cose.

Tutto è felice, finché non mi rendo conto che voglio cambiare la definizione di Bar.

Se ho appena ridefinito Bar, ottengo Redeclaration of symbolun'eccezione.

Ho provato a usare MONKEY-TYPINGe in augmentquesto modo:

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

Ma questo mi ha dato lo stesso errore.

Perché lo voglio? Quindi posso scorrere le definizioni del mio sottoinsieme (o classe o altro simbolo), riutilizzando i test che ho già digitato che sono nella mia storia.

Risposte:


3

Penso che il REPL faccia parte della sua magia EVALinserendo ogni nuovo input in un nuovo ambito lessicale nidificato. Quindi, se dichiari delle cose my, puoi ombreggiarle con le dichiarazioni inserite in seguito:

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;

Se si omette my, verranno utilizzati subsete classdichiarati, oure poiché in ourrealtà è my+ l'aggiunta del simbolo al pacchetto allegato ...; si scopre se si elimina il simbolo dal pacchetto, è quindi possibile ombreggiarlo nuovamente in seguito:

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

NOTA: questi risultati provengono solo dai miei esperimenti nel REPL. Non sono sicuro se ci sono altri effetti collaterali sconosciuti.


8

L' REPLha i suoi difetti. È una costruzione elaborata di EVALaffermazioni che cercano di lavorare insieme. A volte non funziona.

Immagino che il meglio che possiamo fare sia introdurre un comando REPL che gli faccia dimenticare tutto ciò che ha fatto prima. Patch benvenute! :-)


Quindi, se ho capito bene, ero sulla strada giusta con use MONKEY-TYPINGe augmentma non funzionano correttamente nel REPL (ancora?) Perché ha bisogno di molta magia e nastro adesivo.
daotoad,

1
AFAIK, puoi usare solo augment per aggiungere elementi a una classe. Quello che stai cercando di fare è sostituire un sottoinsieme .
Elizabeth Mattijsen,

1
@daotoad Per sostituire, puoi usare supersede, ma credo che al momento non sia stato implementato.
user0721090601

1
Sostituire non è ancora implementato, ma funzionerebbe comunque solo a livello di modulo installato. La funzione di sostituzione dovrebbe consentire a un modulo di indicare che deve essere caricato anziché un altro modulo / versione. È quindi un suggerimento per CompUnitRepo quando viene chiesto se può fornire un determinato modulo.
Elizabeth Mattijsen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.