Existe uma maneira de redeclarar com segurança um símbolo?


9

Costumo me fazer experiências no REPL e direi algo como:

subset Bar of Int where * %% 57;

Então brinco Barum pouco com as coisas boas.

Tudo é feliz, até eu perceber que quero mudar a definição de Bar.

Se eu apenas redefinir Bar, recebo uma Redeclaration of symbolexceção.

Eu tentei usar MONKEY-TYPINGe augmentassim:

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

Mas isso me rendeu o mesmo erro.

Por que eu quero isso? Para que eu possa iterar nas definições do meu subconjunto (ou classe ou outro símbolo), enquanto reutilizo os testes que já digitei que estão no meu histórico.

Respostas:


3

Eu acho que o REPL faz parte de sua mágica, EVALinserindo cada nova entrada em um novo escopo lexical aninhado. Portanto, se você declarar as coisas my, poderá sombrear as mesmas com as declarações inseridas posteriormente:

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;

Se você omitir my, serão usados for subsete classdeclarações, oure uma vez que ouré realmente my+ adicionar o símbolo ao pacote anexo ...; Acontece que, se você excluir o símbolo do pacote, poderá sombrear novamente mais tarde:

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

NOTA: Esses resultados são apenas dos meus experimentos no REPL. Não tenho certeza se existem outros efeitos colaterais desconhecidos.


8

O REPLtem suas deficiências. É uma construção elaborada de EVALdeclarações que tentam trabalhar juntas. Às vezes isso não dá certo.

Acho que o melhor que poderíamos fazer é introduzir um comando REPL que faria esquecer tudo o que já havia feito antes. Patches bem-vindos! :-)


Então, se eu entendi, eu estava no caminho certo com use MONKEY-TYPINGe augmentmas eles não funcionam corretamente no REPL (ainda?), Porque ele precisa de muita magia e fita de pato.
daotoad

11
AFAIK, você só pode usar o aumento para adicionar itens a uma classe. O que você está tentando fazer é substituir um subconjunto .
Elizabeth Mattijsen 16/11/19

11
@daotoad Para substituir, você pode usar supersede, mas acredito que atualmente não seja implementado.
user0721090601

11
O substituto ainda não foi implementado, mas isso funcionaria apenas no nível do módulo instalado. A função de substituição deve permitir que um módulo indique que deve ser carregado em vez de outro módulo / versão. Portanto, é uma dica para o CompUnitRepo quando perguntado se ele pode fornecer um determinado módulo.
Elizabeth Mattijsen 18/11/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.