ref: 96639193bad1db5ff22f17bacbcd4eeecd024ba9
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; }