Как связать блок локального контекста с глобальным контекстом в Rebol2?
Вопрос
Насколько я понимаю, вы должны иметь возможность привязать любой блок к любому контексту.В частности, вы можете связать блок глобального контекста с локальным контекстом:
>> a: context [
print: does [rebol/words/print "yeah!"]
f: func[b] [do bind b 'print]
]
>> a/f [print "hello"]
yeah!
== "hello"
Значит, должна быть возможность связать блок локального контекста и с глобальным контекстом?Но мои попытки не увенчались успехом:
>> 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
Кажется, у меня получилось, но:
>> equal? bind? 'system bind? in b 'b
== false
>> same? bind? in b 'f bind? in b 'b
== true
В чем здесь моя ошибка?
Решение
Вы связываете слова в блоке, назначенном b/b
, вы не связываете слово b
сам.
>> equal? bind? 'system bind? in b 'b
== false
Это сравнивает два объекта, первый - тот, который 'system
обязательно, а второй — тот, который in b 'b
привязан к (верхнему уровню b
объект).
Дело в том, что блоки на самом деле не связаны, слова в блоке связаны.Сами блоки не имеют никаких привязок, даже как концепция.Кроме того, блок, назначенный b/b
это просто значение, которое присваивается b/b
, это не то слово 'b
.
Это сравнение должно работать:
>> equal? bind? 'system bind? first get in b 'b
== true
С этим вы сравниваете привязку первого слова в блоке, назначенном b/b
, что это такое print
что вы связали ранее.Это слово - то, для чего вы изменили привязку в b/f
.
Другие советы
Связывающая информация передается в виде слов, а не блоков.При повторном связывании блока процесс связывания повлияет на слова, содержащиеся в блоке.Так что ваши b/b
блок (а не in b 'b
слово) отбито правильно, но ваш чек неправильный.Вам необходимо получить контекст одного из слов отскока внутри блока, например:
>> equal? bind? 'system bind? b/b/1
== true