Có cách nào để tái định nghĩa một cách an toàn một biểu tượng?


9

Tôi thường thấy mình đang thử nghiệm trong REPL và tôi sẽ nói một cái gì đó như:

subset Bar of Int where * %% 57;

Sau đó, tôi chơi xung quanh với các kiểm tra về Bar-ness cho mọi thứ một chút.

Mọi thứ đều hạnh phúc, cho đến khi tôi nhận ra rằng tôi muốn thay đổi định nghĩa Bar.

Nếu tôi chỉ xác định lại Bar, tôi sẽ có một Redeclaration of symbolngoại lệ.

Tôi đã thử sử dụng MONKEY-TYPINGaugmentnhư thế này:

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

Nhưng điều đó đã gây ra lỗi tương tự cho tôi.

Tại sao tôi muốn điều này? Vì vậy, tôi có thể lặp lại các định nghĩa tập hợp con (hoặc lớp hoặc biểu tượng khác) của mình, trong khi sử dụng lại các bài kiểm tra mà tôi đã nhập trong lịch sử của mình.

Câu trả lời:


3

Tôi nghĩ REPL thực hiện một phần phép thuật của mình bằng cách - EVALmỗi đầu vào mới trong phạm vi từ vựng lồng nhau mới. Vì vậy, nếu bạn khai báo mọi thứ với mythì bạn có thể theo dõi chúng bằng các khai báo được nhập sau:

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;

Nếu bạn bỏ qua my, thì for subsetclasskhai báo, oursẽ được sử dụng và vì ourthực tế là my+ thêm biểu tượng vào gói kèm theo ...; Hóa ra nếu bạn xóa biểu tượng khỏi gói, bạn có thể đổ bóng lại sau:

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

LƯU Ý: Những kết quả này chỉ là từ các thử nghiệm của tôi trong REPL. Tôi không chắc chắn nếu có tác dụng phụ chưa biết khác.


8

REPLnhững thiếu sót của nó. Đó là một công trình xây dựng công phu của các EVALtuyên bố cố gắng làm việc cùng nhau. Đôi khi điều đó không thành công.

Tôi đoán điều tốt nhất chúng ta có thể làm là giới thiệu một lệnh REPL sẽ khiến nó quên mọi thứ nó đã làm trước đây. Bản vá chào mừng! :-)


Vì vậy, nếu tôi hiểu chính xác, tôi đã đi đúng hướng use MONKEY-TYPINGaugmentnhưng họ không hoạt động đúng trong REPL (chưa?) Vì nó cần rất nhiều ma thuật và băng vịt.
daotoad

1
AFAIK, bạn chỉ có thể sử dụng augment để thêm công cụ vào một lớp. Những gì bạn đang cố gắng làm là thay thế một tập hợp con .
Elizabeth Mattijsen

1
@daotoad Để thay thế, bạn có thể sử dụng supersede, nhưng tôi tin ở thời điểm hiện tại vẫn chưa được thực hiện.
user0721090601

1
Supersede vẫn chưa được thực hiện, nhưng dù sao nó cũng chỉ hoạt động ở cấp độ mô-đun đã cài đặt. Hàm thay thế sẽ cho phép một mô-đun chỉ ra rằng nó nên được tải thay vì mô-đun / phiên bản khác. Do đó, đây là một gợi ý cho CompUnitRepo khi được hỏi liệu nó có thể cung cấp một mô-đun nhất định không.
Elizabeth Mattijsen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.