シンボルを安全に再宣言する方法はありますか?


9

REPLで実験していることがよくあるので、次のように言います。

subset Bar of Int where * %% 57;

次にBar、物事の-nessのチェックを少し試します。

の定義を変更したいことに気づくまで、すべてが幸せですBar

単に再定義Barすると、Redeclaration of symbol例外が発生します。

私はこれを使っMONKEY-TYPINGaugmentみました:

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

しかし、それは私に同じエラーをもたらしました。

なぜこれが必要なのですか?したがって、自分の履歴にある既に入力したテストを再利用しながら、サブセット(またはクラス、またはその他のシンボル)の定義を反復処理できます。

回答:


3

REPLはEVAL、新しいネストされたレキシカルスコープで新しい入力を1つずつ処理することで、その魔法の一部を実行していると思います。ですから、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、for 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
申し訳ありませんが、augmentを使用してクラスに項目を追加することしかできません。あなたがしようとしていることはサブセットを置き換えることです。
Elizabeth Mattijsen

1
@daotoad置き換えるには、を使用できますsupersedeが、現時点では実装されていないと考えています。
user0721090601

1
Supersedeはまだ実装されていませんが、インストールされたモジュールレベルでしか機能しません。supersede関数は、モジュールが別のモジュール/バージョンの代わりに読み込まれることを示すことを許可する必要があります。したがって、指定されたモジュールを提供できるかどうかを尋ねられたとき、それはCompUnitRepoへのヒントです。
Elizabeth Mattijsen、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.