1 #ifndef RLANG_NODE_H
2 #define RLANG_NODE_H
3 
4 
r_node_car(sexp * x)5 static inline sexp* r_node_car(sexp* x) { return CAR(x); }
r_node_cdr(sexp * x)6 static inline sexp* r_node_cdr(sexp* x) { return CDR(x); }
r_node_tag(sexp * x)7 static inline sexp* r_node_tag(sexp* x) { return TAG(x); }
r_node_caar(sexp * x)8 static inline sexp* r_node_caar(sexp* x) { return CAAR(x); }
r_node_cadr(sexp * x)9 static inline sexp* r_node_cadr(sexp* x) { return CADR(x); }
r_node_cdar(sexp * x)10 static inline sexp* r_node_cdar(sexp* x) { return CDAR(x); }
r_node_cddr(sexp * x)11 static inline sexp* r_node_cddr(sexp* x) { return CDDR(x); }
12 
13 static inline
r_node_poke_car(sexp * x,sexp * newcar)14 sexp* r_node_poke_car(sexp* x, sexp* newcar) {
15   SETCAR(x, newcar);
16   return x;
17 }
18 static inline
r_node_poke_cdr(sexp * x,sexp * newcdr)19 sexp* r_node_poke_cdr(sexp* x, sexp* newcdr) {
20   SETCDR(x, newcdr);
21   return x;
22 }
23 static inline
r_node_poke_tag(sexp * x,sexp * tag)24 sexp* r_node_poke_tag(sexp* x, sexp* tag) {
25   SET_TAG(x, tag);
26   return x;
27 }
28 static inline
r_node_poke_caar(sexp * x,sexp * newcaar)29 sexp* r_node_poke_caar(sexp* x, sexp* newcaar) {
30   SETCAR(CAR(x), newcaar);
31   return x;
32 }
33 static inline
r_node_poke_cadr(sexp * x,sexp * newcar)34 sexp* r_node_poke_cadr(sexp* x, sexp* newcar) {
35   SETCADR(x, newcar);
36   return x;
37 }
38 static inline
r_node_poke_cdar(sexp * x,sexp * newcdar)39 sexp* r_node_poke_cdar(sexp* x, sexp* newcdar) {
40   SETCDR(CAR(x), newcdar);
41   return x;
42 }
43 static inline
r_node_poke_cddr(sexp * x,sexp * newcdr)44 sexp* r_node_poke_cddr(sexp* x, sexp* newcdr) {
45   SETCDR(CDR(x), newcdr);
46   return x;
47 }
48 
49 static inline
r_new_node(sexp * car,sexp * cdr)50 sexp* r_new_node(sexp* car, sexp* cdr) {
51   return Rf_cons(car, cdr);
52 }
53 static inline
r_new_node3(sexp * car,sexp * cdr,sexp * tag)54 sexp* r_new_node3(sexp* car, sexp* cdr, sexp* tag) {
55   sexp* out = Rf_cons(car, cdr);
56   SET_TAG(out, tag);
57   return out;
58 }
59 
r_pairlist(sexp * car)60 static inline sexp* r_pairlist(sexp* car) {
61   return Rf_list1(car);
62 }
r_pairlist2(sexp * car1,sexp * car2)63 static inline sexp* r_pairlist2(sexp* car1, sexp* car2) {
64   return Rf_list2(car1, car2);
65 }
r_pairlist3(sexp * car1,sexp * car2,sexp * car3)66 static inline sexp* r_pairlist3(sexp* car1, sexp* car2, sexp* car3) {
67   return Rf_list3(car1, car2, car3);
68 }
69 
70 sexp* r_pairlist_find(sexp* node, sexp* tag);
71 sexp* r_pairlist_rev(sexp* node);
72 
73 static inline
r_pairlist_get(sexp * node,sexp * tag)74 sexp* r_pairlist_get(sexp* node, sexp* tag) {
75   return r_node_car(r_pairlist_find(node, tag));
76 }
77 
78 static inline
r_pairlist_find_last(sexp * x)79 sexp* r_pairlist_find_last(sexp* x) {
80   while (CDR(x) != R_NilValue)
81     x = CDR(x);
82   return x;
83 }
84 
85 sexp* r_node_tree_clone(sexp* x);
86 sexp* r_pairlist_clone_until(sexp* node, sexp* sentinel, sexp** sentinel_out);
87 
88 
89 #endif
90