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?

Foi útil?

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.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top