มีวิธีในการประกาศสัญลักษณ์ใหม่อย่างปลอดภัยหรือไม่?


9

ฉันมักจะพบว่าตัวเองกำลังทดลองใน REPL และฉันจะพูดว่า:

subset Bar of Int where * %% 57;

จากนั้นฉันก็เล่นกับการตรวจสอบความถูกBarต้องของสิ่งต่าง ๆ สักเล็กน้อย

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;

หมายเหตุ: ผลลัพธ์เหล่านี้มาจากการทดลองของฉันใน REPL ฉันไม่แน่ใจว่ามีผลข้างเคียงอื่น ๆ ที่ไม่รู้จักหรือไม่


8

REPLมีข้อบกพร่องของตน มันเป็นการสร้างEVALประโยคอย่างละเอียดที่พยายามทำงานร่วมกัน บางครั้งมันก็ไม่ได้ผล

ฉันเดาว่าสิ่งที่ดีที่สุดที่เราทำได้คือการแนะนำคำสั่ง REPL ที่จะทำให้มันลืมทุกอย่างที่ทำไปก่อนหน้านี้ ยินดีต้อนรับแพทช์! :-)


ดังนั้นถ้าฉันเข้าใจอย่างถูกต้องฉันอยู่ในเส้นทางที่ถูกต้องด้วยuse MONKEY-TYPINGและaugmentแต่พวกเขาทำงานไม่ถูกต้องใน REPL (หรือยัง?) เพราะมันต้องใช้เวทมนตร์และเทปเป็ดจำนวนมาก
daotoad

1
AFAIK คุณสามารถใช้ augment เพื่อเพิ่มรายการในคลาสได้เท่านั้น สิ่งที่คุณกำลังพยายามที่จะทำคือแทนที่เซต
Elizabeth Mattijsen

1
@daotoad เพื่อแทนที่คุณสามารถใช้supersedeแต่ฉันเชื่อในเวลาปัจจุบันที่ยังไม่ได้ใช้งาน
0721090601

1
Supersede ยังคงไม่มีการใช้งาน แต่จะใช้ได้กับระดับโมดูลที่ติดตั้งเท่านั้น ฟังก์ชั่นแทนที่ควรอนุญาตให้โมดูลระบุว่าควรโหลดแทนที่จะเป็นโมดูล / รุ่นอื่น ดังนั้นจึงเป็นคำใบ้ของ CompUnitRepo เมื่อถูกถามว่าสามารถให้โมดูลที่กำหนดได้หรือไม่
Elizabeth Mattijsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.