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?

È stato utile?

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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top