¿Cómo vincular el bloque de contexto local al contexto global en Rebol2?
Pregunta
Según tengo entendido, se supone que debes poder vincular cualquier bloque a cualquier contexto.En particular, puedes vincular un bloque de contexto global a un contexto local:
>> a: context [
print: does [rebol/words/print "yeah!"]
f: func[b] [do bind b 'print]
]
>> a/f [print "hello"]
yeah!
== "hello"
Entonces, ¿también debe ser posible vincular un bloque de contexto local al contexto global?Pero mis intentos no tuvieron éxito:
>> b: context [
b: [print "hello"]
print: does [rebol/words/print "yeah!"]
f: func[] [do bind b 'system]
]
>> b/b
== [print "hello"]
>> do b/b
yeah!
== "hello"
>> b/f
hello
>> do b/b
hello
Parece que lo logré pero:
>> equal? bind? 'system bind? in b 'b
== false
>> same? bind? in b 'f bind? in b 'b
== true
¿Cuál es mi error aquí?
Solución
Estás vinculando las palabras en el bloque asignado a b/b
, no estás vinculando la palabra b
sí mismo.
>> equal? bind? 'system bind? in b 'b
== false
Esto compara dos objetos, el primero es el que 'system
está obligado a hacerlo, y el segundo es el que in b 'b
está obligado a (el nivel superior b
objeto).
El caso es que los bloques no están realmente unidos, el palabras en el bloque están obligados.Los bloques en sí no tienen ningún vínculo, ni siquiera como concepto.Además, el bloque que está asignado a b/b
es solo un valor que se le asigna a b/b
, no es la palabra 'b
.
Esta comparación debería funcionar:
>> equal? bind? 'system bind? first get in b 'b
== true
Lo que estás comparando con esto es el enlace de la primera palabra en el bloque asignado a b/b
, cual es ese print
que ataste antes.Esa palabra es a la que le cambiaste la encuadernación. b/f
.
Otros consejos
La información vinculante se transmite mediante palabras, no en bloques.Cuando se rebota un bloque, el proceso de vinculación afectará las palabras contenidas en el bloque.Entonces tus b/b
bloque (y no el in b 'b
palabra) ha sido rebotado correctamente, pero su cheque es incorrecto.Debes recuperar el contexto de una de las palabras de rebote dentro del bloque, como en:
>> equal? bind? 'system bind? b/b/1
== true