Por que a adição dinâmica de código ao objeto não entra em vigor no Rebol2?
Pergunta
Esta questão é sobre como adicionar código dinamicamente a contextos ou objetos no rebol 2, está relacionada à questão Adicionando palavras dinamicamente a um contexto no REBOL mas não é do mesmo tipo.
Se eu quiser adicionar código dinamicamente a objetos rebol usando seu bloco de código, tive problemas devido a um comportamento estranho:
>> append third o [c: 3]
== [a: 1 b: 2 c: 3]
mas...
>> first o
== [self a b]
>> second o
== [make object! [
a: 1
b: 2
] 1 2]
>> third o
== [a: 1 b: 2]
o anexo está faltando!o mesmo se anexar a first o
ou second o
isso não ocorre usando blocos "comuns":
>> m: [a [b] c]
== [a [b] c]
>> append m 3
== [a [b] c 3]
>> m
== [a [b] c 3]
>> append second m 1
== [b 1]
>> m
== [a [b 1] c 3]
por que é isso?
Solução
O third
A função não retorna a especificação original do objeto, ela retorna um novo bloco de palavras e valores definidos que são gerados a partir das palavras e valores do objeto.Então você está anexando a esse novo bloco (que afeta o bloco, mas não o objeto).
Você não pode obter uma referência de série ao bloco original passada como especificação do objeto.Ele é jogado fora depois que o objeto é construído e, de qualquer maneira, não tem mais efeito sobre o objeto.Então ainda que você salvou uma referência ao bloco para o qual passou make object
, anexar a ele também não faria nada ao objeto.
Você simplesmente não pode anexar objetos no Rebol 2.Mas no Rebol 3, você pode anexar aos objetos:
>> append make object! [a: 1 b: 2] [c: 3]
== make object! [
a: 1
b: 2
c: 3
]
(Observação:Não use os refletores ordinais no Rebol 2.Usar words-of
em vez de first
, values-of
em vez de second
, e body-of
em vez de third
.Os refletores ordinais foram descontinuados desde o Rebol 2.7.7, lançado há 5 anos, e foram removidos no Rebol 3.)