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 /parser.c | |
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.
Diffstat (limited to 'parser.c')
-rw-r--r-- | parser.c | 25 |
1 files changed, 25 insertions, 0 deletions
@@ -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) { |