Для блока нет "родительской" ссылки! series, поскольку на нее можно ссылаться из нескольких других блоков! серии, поэтому понятие «родитель» в таких случаях не имеет смысла.
Тем не менее, вы можете вручную добавить обратную ссылку в свой блок, когда вам это нужно (просто обратите внимание, когда ПРОБИРОВАНИЕ или ФОРМОВАНИЕ «дочернего» блока приведет к разыменованию указанных блоков, что приведет к гораздо более подробному результату. чем хочешь).
Совет: я иногда добавляю обратные ссылки для значений блоков, используя «скрытый» заголовок (просто перемещая смещение блока, передаются значения, которые вы хотите скрыть). Он устойчив к ПРОБЕ и удобен, но не может быть сериализован (например, на диске) без необходимости написания вашей собственной специальной процедуры сериализации для надлежащей обработки этих обратных ссылок (обычно означает замену их несерийным значением: целым числом, словом, проблема, тег ... все, что позволяет вам восстановить эту ссылку после загрузки обратно).
Например:
>> x: [1 2 3]
== [1 2 3]
>> y: [a b c]
== [a b c]
>> insert/only x y ; insert a reference to y in x
== [1 2 3]
>> x
== [[a b c] 1 2 3] ; y reference is at first position
>> x: next x ; let's hide it now
== [1 2 3]
>> x
== [1 2 3]
>> x/-1 ; here is how to retrieve our "hidden" header
== [a b c]
Обратите внимание, что ярлык / -1 в настоящее время не работает в R3, как в R2.
Итак, для вашего собственного примера кода, приведенного выше, вам нужно создать функцию, которая будет погружаться в вашу исходную структуру блока и вставлять эти скрытые обратные ссылки, чтобы вы могли легко получить к ним доступ при необходимости. Вот пример кода для обработки вашей структуры:
insert-back-ref: func [blk [block!] parent [block! none!]][
if parent [ ;-- no processing if root call
insert/only blk next head parent ;-- insert the back-reference in child
parent/1: blk: next blk ;-- reset the parent reference to child to
] ;-- point after the back-ref (and hide it)
forall blk [
if block? blk/1 [ ;-- if a child block is found
insert-back-ref blk/1 blk ;-- process its content recursively
]
]
]
insert-back-ref fs none ;-- pass none as root parent
?? fs
l: fs/usr/local
?? l
p: l/-1
?? p
p: p/-1
?? p
Это выведет:
fs: [
usr [
local [
bin []
]
share []
]
bin []
]
l: [
bin []
]
p: [
local [
bin []
]
share []
]
p: [[
local [
bin []
]
share []
]
bin []
]
Фактически, мы создали структуру графа с использованием вложенных ссылок на блоки, по которым можно очень просто перемещаться, используя встроенные последовательные действия и пути.
person
DocKimbel
schedule
12.03.2013