2008-11-04 9 views
7

imaginar el siguiente código REBOL:añadir dinámicamente palabras para un contexto en el REBOL

foo: context [bar: 3]

ahora tienen un contexto foo en el que se define 'bar. ¿Cómo puedo inyectar dinámicamente una nueva palabra en este contexto? ¿Es posible?

que he probado:

set/any in foo 'baz 3

Pero eso no funciona porque la expresión in foo 'baz falla porque no hay una palabra 'baz se define en el contexto foo.

debo añadir que me di cuenta de una manera de hacer esto es como sigue:

foo-prototype: [bar: 3] 
foo: context foo-prototype 
foo: context head append foo-prototype [baz: 3]

Pero lo que si usted no tiene acceso a foo 's bloque de prototipo?

Respuesta

8

Puede lograr lo mismo utilizando el objeto existente como prototipo para crear un nuevo objeto.

>> foo: make object! [bar: 3] 
>> foo: make foo [baz: 3] 
>> probe foo 
make object! [ 
    bar: 3 
    baz: 3 
] 
+1

Este es uno de los aspectos fundamentales de REBOL, pero en el momento en que hice esta pregunta, no sabía que podría hacer esto. –

4

Existen varias formas de evitar el hecho de que en REBOL/2 simplemente no es posible ampliar el contexto de los objetos.

Probablemente sólo puede utilizar BLOQUE s en lugar de OBJETO s:!!

>> blobject: [foo 1] 
== [foo 1] 
>> blobject/bar 
** Script Error: Invalid path value: bar 
** Near: blobject/bar 
>> append blobject [bar 2] 
== [foo 1 bar 2] 
>> blobject/bar: 3 
== 3 

Puede incluso hacer 'yo trabajo con sólo añadiendo el objeto en sí mismo:

>> insert blobject reduce ['self blobject] 
== [[...] foo 1 bar 2] 
>> same? blobject blobject/self 
== true 

Pero a medida que' Si solicitó extender OBJECT! s, puede optar por la solución de Peter WA Wood para simplemente clonar el objeto. Solo tenga en cuenta que con este enfoque, el clon resultante realmente es una cosa diferente que el objeto original.

lo tanto, si alguna palabra se ha configurado para contener el objeto antes de la clonación/extender, después de clonar el objeto de que la palabra todavía llevará a cabo el objeto no extendido:

>> remember: object: make object! [foo: 1] 
>> object: make object [bar: 2] 
>> same? remember object 
== false 
>> probe remember 
make object! [ 
    foo: 1 
] 

En caso de que sea esencial para que usted mantenga "referencias" al objeto intactas, es posible que desee para envolver el objeto que necesita para extenderse en un objeto exterior como en

>> remember: object: make object! [access: make object! [foo: 1]] 
>> object/access: make object/access [bar: 2] 
>> same? remember object 
== true 

a continuación, puede extenderse Safley el objeto mientras se mantiene, es dada sólo almacenan referencias al contenedor .

REBOL/3, por cierto, permitirá agregar palabras a OBJECT! S.

+0

¡Respuesta muy informativa! Aprendí TON sobre REBOL desde que publiqué esta pregunta. –

1

Dicho en REBOL/Guía del usuario de Core:.. "Muchos bloques contienen otros bloques y cuerdas cuando se copia un bloque tal, su sub-series no se copian La sub-serie se denominan directamente y son los mismos datos de serie como el bloque original ".

+0

Corrígeme si estoy equivocado, pero ¿esto no se relaciona con 'object!' S en lugar de 'blocks'' s? –

Cuestiones relacionadas