Apakah ada cara untuk mendeklarasikan ulang simbol dengan aman?


9

Saya sering menemukan diri saya bereksperimen dalam REPL dan saya akan mengatakan sesuatu seperti:

subset Bar of Int where * %% 57;

Lalu aku bermain-main dengan cek pada Bar-ness untuk hal-hal sebentar.

Semuanya bahagia, sampai saya sadar bahwa saya ingin mengubah definisi Bar.

Jika saya hanya mendefinisikan ulang Bar, saya mendapat Redeclaration of symbolpengecualian.

Saya mencoba menggunakan MONKEY-TYPINGdan augmentmenyukai ini:

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

Tapi itu membuat saya kesalahan yang sama.

Mengapa saya menginginkan ini? Jadi saya bisa mengulang definisi subset (atau kelas, atau simbol lainnya), sambil menggunakan kembali tes yang sudah saya ketikkan yang ada dalam riwayat saya.

Jawaban:


3

Saya pikir REPL melakukan bagian dari sihirnya dengan EVAL-ing setiap input baru dalam lingkup leksikal bersarang baru. Jadi, jika Anda mendeklarasikan sesuatu dengan mymaka Anda dapat membayangi mereka dengan deklarasi yang dimasukkan nanti:

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;

Jika Anda menghilangkan my, maka untuk subsetdan classdeklarasi, ourakan digunakan, dan karena oursebenarnya my+ menambahkan simbol ke paket terlampir ...; ternyata jika Anda menghapus simbol dari paket, Anda dapat membayangnya lagi nanti:

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

CATATAN: Hasil ini hanya dari percobaan saya di REPL. Saya tidak yakin apakah ada efek samping lain yang tidak diketahui.


8

The REPLmemiliki kekurangan. Ini adalah konstruksi EVALpernyataan yang rumit yang mencoba untuk bekerja sama. Terkadang itu tidak berhasil.

Saya kira yang terbaik yang bisa kami lakukan, adalah memperkenalkan perintah REPL yang akan membuatnya melupakan semua yang telah dilakukan sebelumnya. Sambutan diterima! :-)


Jadi jika saya mengerti dengan benar, saya berada di jalur yang benar dengan use MONKEY-TYPINGdan augmenttetapi mereka tidak bekerja dengan benar di REPL (belum?) Karena itu membutuhkan banyak pita sihir dan bebek.
daotoad

1
AFAIK, Anda hanya bisa menggunakan augment untuk menambahkan barang ke kelas. Apa yang Anda coba lakukan adalah mengganti suatu bagian .
Elizabeth Mattijsen

1
@daotoad Untuk mengganti, Anda dapat menggunakan supersede, tapi saya yakin saat ini masih belum diterapkan.
pengguna0721090601

1
Menggantikan masih belum diimplementasikan, tetapi itu hanya akan bekerja pada tingkat modul yang diinstal pula. Fungsi menggantikan harus memungkinkan modul untuk menunjukkan itu harus dimuat, bukan modul / versi lain. Oleh karena itu itu adalah petunjuk bagi CompUnitRepo ketika ditanya apakah itu dapat memberikan modul yang diberikan.
Elizabeth Mattijsen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.