ref: 1c8789198373a52da9e80dc9b2b1ee2b67af61c4
dir: /dat.h/
#define PrecedenceLevels 1200 typedef struct Operator Operator; typedef struct Term Term; typedef struct Binding Binding; typedef struct Goal Goal; typedef struct Choicepoint Choicepoint; typedef struct Clause Clause; typedef struct Predicate Predicate; typedef struct Module Module; typedef int (*Builtin)(Term *, Binding **, Module *); struct Operator { int type; int level; Rune *spelling; Operator *next; }; 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; Module *module; /* What module is this goal to be evaluated in? */ Term *catcher; /* When this is non-nil, the goal is a catch frame, goal is the recovery. */ Goal *next; }; struct Choicepoint { Goal *goalstack; Clause *alternative; Binding *altbindings; 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; Clause *next; }; struct Predicate { Rune *name; int arity; int public; int builtin; /* All the predicates from the system module are builtin */ int dynamic; Clause *clauses; Predicate *next; }; struct Module { /* What about imports */ Rune *name; Predicate *predicates; Operator *operators[PrecedenceLevels]; Module *next; }; /* Operator types */ enum { Xf = 1<<0, /* 1 */ Yf = 1<<1, /* 2 */ Xfx = 1<<2, /* 4 */ Xfy = 1<<3, /* 8 */ Yfx = 1<<4, /* 16 */ Fy = 1<<5, /* 32 */ Fx = 1<<6, /* 64 */ }; /* 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 */ uvlong clausenr; Binding *replbindings; /* The bindings used by the repl */ Term *replquery; /* The currently active repl query */