130 fputc(sep, out); sep =
',';
143 }
else if (
isNil(l)) {
156 int i;
double f;
Sym s;
void* p;
161 if (
isInt(n, &i)) fprintf (out,
"%d", i);
162 else if (
isDouble(n, &f)) fprintf (out,
"%f", f);
163 else if (
isSym(n, &s)) fprintf (out,
"%s",
name(s));
164 else if (
isPointer(n, &p)) fprintf (out,
"#%p", p);
169 for (
int i=0; i<k; i++) {
170 fputc(sep, out); sep =
',';
185 if (i == 0)
return hd(l);
201 while (
isList(l)) { l =
tl(l); n++; }
225 while (c>i) r =
cons(
nth(l,--c), r);
265 if (
hd(l) == e)
return true;
266 if (
hd(l) > e)
return false;
277 }
else if (e ==
hd(l)) {
292 }
else if (e ==
hd(l)) {
319 if (
isNil(A))
return B;
320 if (
isNil(B))
return A;
329 if (
isNil(A))
return A;
330 if (
isNil(B))
return B;
338 if (
isNil(A))
return A;
339 if (
isNil(B))
return A;
359 if (
hd(
hd(env)) == key) {
375 if (
isNil(pl))
return false;
376 if (
left(
hd(pl)) == key) { val=
right(
hd(pl));
return true; }
390 if (
left(
hd(pl)) == key)
return tl(pl);
398 CTree* pl = t->attribut();
399 if (pl) t->attribut(
updateKey(pl, key, val));
400 else t->attribut(
updateKey(nil, key, val));
405 CTree* pl = t->attribut();
411 CTree* pl = t->attribut();
412 if (pl)
return findKey(pl, key, val);
452 return (
isNil(p)) ? t : p;
458 for (
int i = 0; i < n; i++) {
486 snprintf(name, 255,
"SUBST<%p,%p,%p> : ", (
CTree*)t, (
CTree*)
id, (
CTree*)val);
500 }
else if (t->
arity() == 0) {
503 return (
isNil(p)) ? t : p;
508 for (
int i = 0; i < n; i++) {
509 br.push_back(
subst(t->
branch(i), propkey, id, val) );
Tree pushEnv(Tree key, Tree val, Tree env)
Symbol * unique(const char *str)
Returns a new unique symbol of name strxxx.
Tree substitute(Tree t, Tree id, Tree val)
bool searchEnv(Tree key, Tree &v, Tree env)
Tree addElement(Tree e, Tree l)
static bool printlist(Tree l, FILE *out)
Class Node = (type x (int + double + Sym + void*))
static Tree substkey(Tree t, Tree id, Tree val)
Tree cons(Tree a, Tree b)
Tree remElement(Tree e, Tree l)
static Tree subst(Tree t, Tree propkey, Tree id, Tree val)
Tree lmap(tfun f, Tree l)
A CTree = (Node x [CTree]) is a Node associated with a list of subtrees called branches.
Tree rconcat(Tree l, Tree q)
const Node & node() const
return the content of the tree
void remProperty(Tree t, Tree key)
static Tree rmap(tfun f, Tree l)
Tree setIntersection(Tree A, Tree B)
Tree lrange(Tree l, int i, int j)
static bool findKey(Tree pl, Tree key, Tree &val)
Tree tmap(Tree key, tfun f, Tree t)
Tree setUnion(Tree A, Tree B)
void setProperty(Tree key, Tree value)
Tree replace(Tree l, int i, Tree e)
bool isDouble(const Node &n)
bool isSym(const Node &n)
Tree concat(Tree l, Tree q)
static Tree updateKey(Tree pl, Tree key, Tree val)
int arity() const
return the number of branches (subtrees) of a tree
const char * name(Symbol *sym)
Returns the name of a symbol.
static Tree removeKey(Tree pl, Tree key)
Symbols are unique objects with a name stored in a hash table.
Tree setDifference(Tree A, Tree B)
void setProperty(Tree t, Tree key, Tree val)
Symbol * symbol(const char *str)
Returns (and creates if new) the symbol of name str.
bool isPointer(const Node &n)
Tree getProperty(Tree key)
bool isInt(const Node &n)
Tree branch(int i) const
return the ith branch (subtree) of a tree
bool isElement(Tree e, Tree l)
bool getProperty(Tree t, Tree key, Tree &val)
void print(Tree t, FILE *out)