Come legare il blocco di contesto locale al contesto globale in Rebol2?
Domanda
Come lo capisco, dovresti essere in grado di associare qualsiasi blocco a qualsiasi contesto.In particolare è possibile legare un blocco di contesto globale a un contesto locale:
>> a: context [
print: does [rebol/words/print "yeah!"]
f: func[b] [do bind b 'print]
]
>> a/f [print "hello"]
yeah!
== "hello"
.
Quindi deve essere possibile vincolare un blocco di contesto locale anche al contesto globale?Ma i miei tentativi non hanno avuto successo:
>> 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
.
Sembra che l'ho fatto ma:
>> equal? bind? 'system bind? in b 'b
== false
>> same? bind? in b 'f bind? in b 'b
== true
.
Qual è il mio errore qui?
Soluzione
Si leghi le parole nel blocco assegnato a b/b
, non è vincolante la parola b
stessa.
>> equal? bind? 'system bind? in b 'b
== false
.
Si confronta due oggetti, il primo è quello che è quello che generarecodicitagcode è destinato a, e il secondo è quello che è quello che 'system
è destinato a (l'oggetto in b 'b
di alto livello).
La cosa è che i blocchi non sono realmente vincolati, le parole nel blocco sono vincolate.I blocchi stessi non hanno affascinanti, nemmeno come un concetto.Inoltre, il blocco assegnato a b
è solo un valore che accade da assegnare a b/b
, non è la parola b/b
.
Questo confronto dovrebbe funzionare:
>> equal? bind? 'system bind? first get in b 'b
== true
.
Quello che si confronta con questo è il legame della prima parola nel blocco assegnato a 'b
, che è quel b/b
che hai legato prima.Quella parola è ciò che hai cambiato il legame di in print
.
Altri suggerimenti
Le informazioni vincolanti sono trasportate da parole, non blocchi.Quando un blocco viene rimbalzato, il processo di rilegatura influenzerà le parole contenute nel blocco.Quindi il tuo blocco b/b
(e non la parola in b 'b
) è stato rimbalzo correttamente, ma il controllo è sbagliato.È necessario recuperare il contesto da una delle parole di rimbalzo all'interno del blocco, come in:
>> equal? bind? 'system bind? b/b/1
== true
.