Pergunta

Pelo que entendi, você deve ser capaz de vincular qualquer bloco a qualquer contexto.Em particular, você pode vincular um bloco de contexto global a um contexto local:

>> a: context [
    print: does [rebol/words/print "yeah!"]
    f: func[b] [do bind b 'print]
]

>> a/f [print "hello"]
yeah!
== "hello"

Portanto, também deve ser possível vincular um bloco de contexto local ao contexto global?Mas minhas tentativas não tiveram sucesso:

>> 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 consegui, mas:

>> equal? bind? 'system bind? in b 'b
== false

>> same? bind? in b 'f bind? in b 'b
== true

Qual é o meu erro aqui?

Foi útil?

Solução

Você está vinculando as palavras no bloco atribuído a b/b, você não está vinculando a palavra b em si.

>> equal? bind? 'system bind? in b 'b
== false

Isso compara dois objetos, o primeiro é aquele que 'system está vinculado, e o segundo é aquele que in b 'b está vinculado a (o nível superior b objeto).

O problema é que os blocos não estão realmente vinculados, o palavras no bloco são ligados.Os blocos em si não possuem nenhuma ligação, nem mesmo como conceito.Além disso, o bloco atribuído a b/b é apenas um valor que é atribuído a b/b, não é a palavra 'b.

Esta comparação deve funcionar:

>> equal? bind? 'system bind? first get in b 'b
== true

O que você está comparando com isso é a ligação da primeira palavra no bloco atribuído a b/b, que é isso print que você ligou antes.Essa palavra é o que você mudou a ligação em b/f.

Outras dicas

A informação vinculativa é transportada por palavras, não por blocos.Quando um bloco é rebote, o processo de vinculação afetará as palavras contidas no bloco.Então seu b/b bloco (e não o in b 'b palavra) foi recuperado corretamente, mas seu cheque está errado.Você precisa recuperar o contexto de uma das palavras rebote dentro do bloco, como em:

>> equal? bind? 'system bind? b/b/1
== true
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top