summaryrefslogtreecommitdiff
path: root/types.c
diff options
context:
space:
mode:
Diffstat (limited to 'types.c')
-rw-r--r--types.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/types.c b/types.c
new file mode 100644
index 0000000..6f2b33d
--- /dev/null
+++ b/types.c
@@ -0,0 +1,58 @@
+#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;
+} \ No newline at end of file