Чи є спосіб безпечно переоформити символ?


9

Я часто опиняюсь, що експериментую в REPL, і я скажу щось на зразок:

subset Bar of Int where * %% 57;

Потім я Barтрохи розігруюсь з перевірками на -ness для речей.

Все радіє, поки я не зрозумію, що хочу змінити визначення Bar.

Якщо я просто перероблю Bar, я отримую Redeclaration of symbolвиняток.

Я спробував використовувати MONKEY-TYPINGі augmentяк це:

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

Але це усунуло мені ту саму помилку.

Чому я хочу цього? Тож я можу повторити визначення моїх підмножин (або класу, або інших символів), використовуючи при цьому повторно використані тести, які я вже ввів, які є в моїй історії.

Відповіді:


3

Я думаю, що REPL виконує частину своєї магії, EVALдодаючи кожен новий вхід у новому вкладеному лексичному просторі. Отже, якщо ви декларуєте речі, myви можете затінити їх деклараціями, введеними пізніше:

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;

Якщо ви пропустите my, то для subsetі classдекларацій ourбудуть використані, а оскільки ourнасправді my+ додавання символу до пакету, що додається ...; Виявляється, якщо ви видалите символ із пакета, ви можете пізніше затінити його пізніше:

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

ПРИМІТКА. Ці результати є лише моїми експериментами у відповіді. Я не впевнений, чи є інші невідомі побічні ефекти.


8

У REPLсвоїх недоліків є. Це складна конструкція EVALтверджень, які намагаються працювати разом. Іноді це не виходить.

Я думаю, найкраще, що ми могли зробити, - це ввести команду REPL, яка б змусила забути все, що вона робила раніше. Латки ласкаво просимо! :-)


Так що, якщо я правильно розумію, я був на правильному шляху з use MONKEY-TYPINGі , augmentале вони не працюють належним чином в реплєї (поки що?) , Тому що потрібно багато магії і качок стрічки.
daotoad

1
AFAIK, ви можете використовувати додаток лише для додавання матеріалів до класу. Те , що ви намагаєтеся зробити , це замінити собою підмножина .
Єлизавета Маттійсен

1
@daotoad Для заміни ви можете використовувати supersede, але я вважаю, що в даний час це залишається без змін.
user0721090601

1
Supersede все ще не виконаний, але це все одно працюватиме лише на встановленому рівні модуля. Функція supersede повинна дозволяти модулю вказувати, що він повинен бути завантажений замість іншого модуля / версії. Тому це є підказкою для CompUnitRepo, коли його запитують, чи може він надати заданий модуль.
Елізабет Маттійсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.