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í?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top