Pregunta

Esta pregunta trata sobre agregar código dinámicamente a contextos u objetos en rebol 2, está relacionada con la pregunta Agregar palabras dinámicamente a un contexto en REBOL pero no es del mismo tipo.

Si quiero agregar código dinámicamente a objetos rebol usando su bloque de código, tuve problemas debido a un comportamiento extraño:

>> append third o [c: 3]
== [a: 1 b: 2 c: 3]

pero...

>> first o
== [self a b]
>> second o
== [make object! [
        a: 1
        b: 2
    ] 1 2]
>> third o
== [a: 1 b: 2]

¡Falta el anexo!lo mismo si se agrega a first o o second o

Esto no ocurre usando bloques "comunes":

>> 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 qué es esto?

¿Fue útil?

Solución

El third La función no devuelve la especificación del objeto original, devuelve un nuevo bloque de palabras y valores que se generan a partir de las palabras y valores del objeto.Entonces estás agregando a ese nuevo bloque (lo que afecta al bloque pero no al objeto).

No puede obtener una referencia de serie al bloque original pasado como especificación del objeto.Se desecha después de construir el objeto y, de todos modos, no tiene ningún efecto adicional sobre el objeto.Entonces incluso si habías guardado una referencia al bloque al que pasaste make object, agregarlo tampoco le haría nada al objeto.

Simplemente no puedes agregar objetos en Rebol 2.Pero en Rebol 3, puedes agregar a objetos:

>> append make object! [a: 1 b: 2] [c: 3]
== make object! [
    a: 1
    b: 2
    c: 3
]

(Nota:No uses los reflectores ordinales en Rebol 2.Usar words-of en lugar de first, values-of en lugar de second, y body-of en lugar de third.Los reflectores ordinales han quedado obsoletos desde Rebol 2.7.7, que salió hace 5 años, y se eliminaron en Rebol 3).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top