Czy istnieje sposób na bezpieczne ponowne oznaczenie symbolu?

9

Często eksperymentuję w REPL i powiem coś takiego:

subset Bar of Int where * %% 57;

Potem przez Barchwilę bawię się sprawdzaniem rzeczy.

Wszystko jest szczęśliwe, dopóki nie uświadomię sobie, że chcę zmienić definicję Bar.

Jeśli przedefiniuję Bar, otrzymam Redeclaration of symbolwyjątek.

Próbowałem użyć MONKEY-TYPINGi augmentpodoba mi się to:

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

Ale to doprowadziło mnie do tego samego błędu.

Dlaczego tego chcę? Mogę więc iterować definicje mojego podzbioru (lub klasy lub innego symbolu), jednocześnie wykorzystując testy, które już wpisałem, które są w mojej historii.

daotoad
źródło

Odpowiedzi:

3

Myślę, że REPL czerpie część swojej magii, wykorzystując EVALkażde nowe wejście w nowym zagnieżdżonym zakresie leksykalnym. Jeśli więc zadeklarujesz rzeczy my, możesz je przesłonić deklaracjami wprowadzonymi później:

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;

Jeśli pominiesz my, zostaną użyte for subseti classdeklaracje, oura ponieważ ourtak naprawdę my+ dodaje symbol do załączającego pakietu ...; okazuje się, że jeśli usuniesz symbol z paczki, możesz go później później cień:

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

UWAGA: Te wyniki pochodzą właśnie z moich eksperymentów w REPL. Nie jestem pewien, czy istnieją inne nieznane działania niepożądane.

cowbaymoo
źródło
8

REPLMa swoje wady. Jest to skomplikowana konstrukcja EVALstwierdzeń, które próbują ze sobą współpracować. Czasami to nie działa.

Myślę, że najlepszym, co moglibyśmy zrobić, było wprowadzenie polecenia REPL, które sprawiłoby, że zapomniałby o wszystkim, co zrobił wcześniej. Łaty mile widziane! :-)

Elizabeth Mattijsen
źródło
Więc jeśli dobrze rozumiem, że jestem na dobrej drodze z use MONKEY-TYPINGa augmentjednak nie działać prawidłowo w REPL (jeszcze?), Ponieważ potrzebuje dużo magii i taśmę kaczki.
daotoad
1
AFAIK, możesz tylko użyć rozszerzenia, aby dodać elementy do klasy. Co chce zrobić, to wymienić na podzbiór .
Elizabeth Mattijsen
1
@daotoad Aby zastąpić, możesz użyć supersede, ale uważam, że w chwili obecnej pozostaje to niewdrożone.
user0721090601
1
Supersede wciąż nie jest zaimplementowane, ale i tak działałoby to tylko na poziomie zainstalowanego modułu. Funkcja zastępowania powinna umożliwić modułowi wskazanie, że należy go załadować zamiast innego modułu / wersji. Jest to zatem wskazówka dla CompUnitRepo, gdy zostanie zapytana, czy może dostarczyć dany moduł.
Elizabeth Mattijsen