ref: bdcc02a5ea2d165c638d667978e8e2cf7462558a
dir: /dat.h/
typedef struct Term Term; typedef struct Binding Binding; typedef struct Goal Goal; typedef struct Choicepoint Choicepoint; typedef struct Clause Clause; typedef struct Module Module; typedef int (*Builtin)(Term *, Binding **); struct Term { int tag; Rune *text; int arity; Term *next; Term *children; vlong ival; double dval; uvlong clausenr; }; struct Binding { Rune *name; uvlong nr; /* Unique number for each clause. Every time a clause is used, it gets a new number. */ Term *value; Binding *next; }; struct Goal { Term *goal; Term *catcher; /* When this is non-nil, the goal is a catch frame, goal is the recovery. */ Goal *next; }; struct Choicepoint { Goal *goalstack; Clause *retryclause; uvlong id; /* Unique number for each clause. Used to know where to cut to. */ Module *currentmodule; Choicepoint *next; }; struct Clause { Term *head; Term *body; uvlong clausenr; int public; Clause *next; }; struct Module { /* What about imports */ Rune *name; Clause *clauses; Module *next; }; /* Sorted so that a lower value means it comes earlier in the standard ordering */ enum { VariableTerm, FloatTerm, IntegerTerm, AtomTerm, CompoundTerm, }; int debug; /* Flags */ enum { DoubleQuotesChars, DoubleQuotesCodes, DoubleQuotesAtom, }; int flagdoublequotes; /* State of the running system */ Choicepoint *choicestack; Goal *goalstack; Module *modules; Module *systemmodule; /* The module for the builtins. Everything has access to those */ Module *usermodule; /* The default module for user defined predicates */