ref: 58e0109ee9ed3aa6ac2e6b0ed621820118a3d1de
dir: /types.c/
#include <u.h>
#include <libc.h>
#include <bio.h>
#include "dat.h"
#include "fns.h"
/* Type tests */
int
islist(Term *t)
{
return (isemptylist(t) || isnonemptylist(t));
}
int
ispartiallist(Term *t)
{
if(t->tag == VariableTerm)
return 1;
else if(t->tag == CompoundTerm && runestrcmp(t->text, L".") == 0 && t->arity == 2)
return ispartiallist(listtail(t));
else
return 0;
}
int
isemptylist(Term *t)
{
return (t->tag == AtomTerm && runestrcmp(t->text, L"[]") == 0);
}
int
isnonemptylist(Term *t)
{
if(t->tag == CompoundTerm && runestrcmp(t->text, L".") == 0 && t->arity == 2)
return islist(listtail(t));
else
return 0;
}
/* Other functions */
Term *
listhead(Term *t)
{
if(t->tag == CompoundTerm && runestrcmp(t->text, L".") == 0 && t->arity == 2)
return t->children;
else
return nil;
}
Term *
listtail(Term *t)
{
if(t->tag == CompoundTerm && runestrcmp(t->text, L".") == 0 && t->arity == 2)
return t->children->next;
else
return nil;
}