Как связать блок локального контекста с глобальным контекстом в Rebol2?

StackOverflow https://stackoverflow.com//questions/22055249

  •  21-12-2019
  •  | 
  •  

Вопрос

Насколько я понимаю, вы должны иметь возможность привязать любой блок к любому контексту.В частности, вы можете связать блок глобального контекста с локальным контекстом:

>> 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top