심볼을 안전하게 다시 선언하는 방법이 있습니까?


9

종종 REPL에서 실험하고 있으며 다음과 같이 말할 것입니다.

subset Bar of Int where * %% 57;

그런 다음 Bar약간 의 문제를 확인하면서 놀고 있습니다.

의 정의를 변경하고 싶다는 것을 알 때까지 모든 것이 행복 Bar합니다.

방금 재정의 Bar하면 Redeclaration of symbol예외 가 발생합니다.

나는 사용하여 시도 MONKEY-TYPINGaugment같은 :

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하면 for subsetclass선언 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 2018

1
AFAIK, 기능 보강 만 사용 하여 수업 물건을 추가 할 수 있습니다 . 당신이하려는 것은 서브셋을 교체 하는 것 입니다.
엘리자베스 마티 센 19

1
@daotoad 바꾸려면을 사용할 수 supersede있지만 현재 구현되지 않은 상태라고 생각합니다.
user0721090601

1
대체는 아직 구현되지 않았지만 설치된 모듈 수준에서만 작동합니다. 대체 기능은 모듈이 다른 모듈 / 버전 대신로드되어야 함을 나타내도록해야합니다. 따라서 주어진 모듈을 제공 할 수 있는지 물으면 CompUnitRepo에 대한 힌트입니다.
엘리자베스 Mattijsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.