给定一个子列表是否有办法获得对它的父/封闭列表/块的引用?例如:
fs: [
usr [
local [
bin []
]
share []
]
bin []
]
l: fs/usr/local ;grab a sublist
p: none ;now grab l's parent (which is fs/usr) without hardcoding the path
感谢您的帮助!
答案 0 :(得分:4)
块没有“父”参考!系列,因为它可以从多个其他块引用!因此,在这种情况下,“父母”的概念毫无意义。
但是,您可以在需要时手动在块中添加反向引用(只需在PROBE-ing或模拟“子”块时注意,这将导致取消引用指向的块导致更多结果比你想要的更详细。
提示:我有时会使用“隐藏”标题添加块值的反向引用(只是移动块偏移量传递了要隐藏的值)。它具有PROBE抗性且方便,但不能序列化(例如在磁盘上)而无需编写自己的特定序列化例程来适当地处理这些反向引用(通常用非序列值替换它们:整数,字, issue,tag ...无论什么允许你重新加载后重建该链接。)
例如:
>> 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]
请注意,在R2中,/ -1快捷方式当前不在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 []
]
实际上,我们使用嵌套块引用创建了一个图形结构,可以使用内置的系列动作和路径非常简单地导航。