Bir sembolü güvenli bir şekilde yeniden tanımlamanın bir yolu var mı?


9

Sık sık kendimi REPL denemede buluyorum ve şöyle bir şey söyleyeceğim:

subset Bar of Int where * %% 57;

Sonra Barbir şeyler için -ness üzerinde kontrol ile oynamak .

Tanımını değiştirmek istediğimi anlayana kadar her şey mutlu Bar.

Sadece yeniden tanımlıyorsam Bar, bir Redeclaration of symbolistisna alıyorum .

Kullanmayı denedim MONKEY-TYPINGve augmentböyle:

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

Ama bu bana aynı hatayı getirdi.

Bunu neden istiyorum? Bu yüzden benim geçmişimde yazmış olduğum testleri tekrar kullanırken alt kümem (veya sınıf veya başka bir sembol) tanımlarımı tekrarlayabilirim.

Yanıtlar:


3

Bence REPL EVALher yeni girdiyi yeni bir iç içe sözcüksel kapsamda büyüler . Yani, bir şeyler beyan myederseniz, daha sonra girilen beyanlarla gölgeleyebilirsiniz:

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;

Atlarsanız my, o zaman subsetve classbildirimler ourkullanılır, çünkü ouraslında my+ ekteki pakete sembol eklenir ...; sembolü paketten silerseniz, daha sonra tekrar gölgeleyebilirsiniz:

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

NOT: Bu sonuçlar sadece REPL'deki deneylerimden alınmıştır. Başka bilinmeyen yan etkiler olup olmadığından emin değilim.


8

REPLEksiklikleri vardır. EVALBirlikte çalışmaya çalışan ayrıntılı bir açıklama yapısıdır . Bazen bu işe yaramaz.

Sanırım yapabileceğimiz en iyi şey, daha önce yaptığı her şeyi unutmasını sağlayacak bir REPL komutu sunmaktır. Yamalar hoş geldiniz! :-)


Eğer doğru anlamak Yani, birlikte doğru yolda olduğunu use MONKEY-TYPINGve augmentancak büyü ve ördek bant çok ihtiyacı var çünkü (henüz?) Repl düzgün çalışmaz.
daotoad

1
AFAIK, artırmayı yalnızca bir sınıfa bir şeyler eklemek için kullanabilirsiniz . Yapmaya çalıştığınız şey bir altkümeyi değiştirmek .
Elizabeth Mattijsen

1
@daotoad Değiştirmek için kullanabilirsiniz supersede, ancak şu anda uygulanmadığına inanıyorum.
user0721090601

1
Supersede hala uygulanmamıştır, ancak bu yine de yalnızca kurulu bir modül düzeyinde çalışır. Yerine geçme işlevi, bir modülün başka bir modül / sürüm yerine yüklenmesi gerektiğini belirtmesine izin vermelidir. Bu nedenle, belirli bir modül sağlayıp sağlayamayacağı sorulduğunda CompUnitRepo'ya bir ipucudur.
Elizabeth Mattijsen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.