diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-10-07 20:16:49 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-10-07 20:16:49 -0700 |
commit | 6acdc55506c2da5de12e28e0b8fc405d211e09c5 (patch) | |
tree | c42811c9e3bf2b0a05603f3fe46758417ce80f47 | |
parent | 3666309d5aa374b813f5f7be7cf186375950b7c5 (diff) | |
download | txr-6acdc55506c2da5de12e28e0b8fc405d211e09c5.tar.gz txr-6acdc55506c2da5de12e28e0b8fc405d211e09c5.tar.bz2 txr-6acdc55506c2da5de12e28e0b8fc405d211e09c5.zip |
tree: circular notation support.
* lib.c (populate_obj_hash): Handle tree object.
* parser.c (circ_backpatch): Likewise.
-rw-r--r-- | lib.c | 5 | ||||
-rw-r--r-- | parser.c | 25 |
2 files changed, 30 insertions, 0 deletions
@@ -11808,6 +11808,11 @@ tail: val sn = car(iter); populate_obj_hash(slot(obj, sn), ctx); } + } else if (treep(obj)) { + val iter = tree_begin(obj); + val node; + while ((node = tree_next(iter))) + populate_obj_hash(key(node), ctx); } break; case FUN: @@ -57,6 +57,7 @@ #include "sysif.h" #include "cadr.h" #include "struct.h" +#include "tree.h" #include "parser.h" #include "regex.h" #include "itypes.h" @@ -400,7 +401,31 @@ tail: else circ_backpatch(p, &cs, sv); } + } else if (treep(obj)) { + val iter = tree_begin(obj); + val node; + val nodes = nil; + + while ((node = tree_next(iter))) { + val k = node->tn.key; + val rk = patch_ref(p, k); + if (rk) + set(mkloc(node->tn.key, node), rk); + else + circ_backpatch(p, &cs, k); + push(node, &nodes); + } + + if (nodes) { + tree_clear(obj); + + while (nodes) { + val node = pop(&nodes); + tree_insert_node(obj, node); + } + } } + break; case FUN: if (obj->f.functype == FINTERP) { |