サブリストが与えられた場合、その親/囲みリスト/ブロックへの参照を取得する方法はありますか?例えば:
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
助けてくれてありがとう!
ブロックの「親」参照はありません!シリーズ、他の複数のブロックから参照できるため!シリーズなので、そのような場合、「親」の概念は無意味です。
ただし、必要に応じてブロックに逆参照を手動で追加できます(「子」ブロックをプローブまたはモールドする場合は注意してください。ポイントされたブロックの逆参照が発生し、より詳細な結果が得られます。あなたが望むよりも)。
ヒント:「非表示」ヘッダーを使用して、ブロック値の後方参照を追加することがあります(非表示にする値を渡したブロックオフセットを移動するだけです)。プローブ耐性があり便利ですが、これらの後方参照を適切に処理するために独自の特定のシリアル化ルーチンを作成する必要がない限り、シリアル化することはできません(通常、整数、単語、問題、タグ...ロードバックされた後にそのリンクを再構築できるものは何でも)。
例えば:
>> 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ショートカットは、現在R2と同様にR3では機能しないことに注意してください。
したがって、上記の独自のコード例では、最初のブロック構造に飛び込んでそれらの非表示の後方参照を挿入する関数を作成し、必要なときに簡単にアクセスできるようにする必要があります。構造を処理するためのサンプルコードは次のとおりです。
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 []
]
実際、組み込みの一連のアクションとパスを使用して非常に簡単にナビゲートできるネストされたブロック参照を使用してグラフ構造を作成しました。