hobbes
a language, embedded compiler, and runtime for efficient dynamic expression evaluation, data storage and analysis
class.H
Go to the documentation of this file.
1 
2 #ifndef HOBBES_LANG_TYPEPREDS_CLASS_HPP_INCLUDED
3 #define HOBBES_LANG_TYPEPREDS_CLASS_HPP_INCLUDED
4 
6 #include <hobbes/lang/expr.H>
7 #include <hobbes/lang/typemap.H>
8 #include <memory>
9 
10 namespace hobbes {
11 
12 // given a set of constraints in TGen form, we can find the implied set of fundeps among them
13 // (this may be more specific than the union of fundeps between constraint types since the
14 // type forms in constraints may add additional structure)
15 FunDeps inferFundeps(const TEnvPtr& tenv, const Constraints& cs);
16 
17 // fundeps union
18 FunDeps mergeFundeps(const FunDeps& lhs, const FunDeps& rhs);
19 
20 // a 'member mapping' is a set of named overloaded definitions
21 typedef std::map<std::string, ExprPtr> MemberMapping;
22 
23 // a 'type class' is a scheme for overloading terms
24 class TCInstance;
25 typedef std::shared_ptr<TCInstance> TCInstancePtr;
26 typedef std::vector<TCInstancePtr> TCInstances;
27 
29 typedef std::shared_ptr<TCInstanceFn> TCInstanceFnPtr;
30 typedef std::vector<TCInstanceFnPtr> TCInstanceFns;
31 
32 class TClass : public Unqualifier, public LexicallyAnnotated {
33 public:
34  typedef std::map<std::string, MonoTypePtr> Members;
35 
36  TClass(const Constraints& reqs, const std::string& tcname, int tvs, const Members& tcmembers, const LexicalAnnotation&);
37  TClass(const Constraints& reqs, const std::string& tcname, int tvs, const Members& tcmembers, const FunDeps& fundeps, const LexicalAnnotation&);
38  TClass(const std::string& tcname, int tvs, const Members& tcmembers, const LexicalAnnotation&);
39  TClass(const std::string& tcname, int tvs, const Members& tcmembers, const FunDeps& fundeps, const LexicalAnnotation&);
40 
41  const std::string& name() const;
42  const Constraints& constraints() const;
43  int typeVars() const;
44  const Members& members() const;
45  const FunDeps& deps() const;
46 
47  // allow any number of instances and instance functions (they'll be checked in insertion order)
48  void insert(const TEnvPtr& tenv, const TCInstancePtr& ip, Definitions* ds);
49  void insert(const TCInstanceFnPtr& ifp);
50 
51  // find the set of instances that match a given constraint
52  TCInstances matches(const TEnvPtr& tenv, const ConstraintPtr& c, MonoTypeUnifier*, Definitions* ds) const;
53  TCInstances matches(const TEnvPtr& tenv, const MonoTypes& mts, MonoTypeUnifier*, Definitions* ds) const;
54 
55  // unqualifier interface
56  bool refine (const TEnvPtr& tenv, const ConstraintPtr& cst, MonoTypeUnifier* s, Definitions* ds);
57  bool satisfied (const TEnvPtr& tenv, const ConstraintPtr& cst, Definitions* ds) const;
58  bool satisfiable(const TEnvPtr& tenv, const ConstraintPtr& cst, Definitions* ds) const;
59  void explain (const TEnvPtr& tenv, const ConstraintPtr& cst, const ExprPtr& e, Definitions* ds, annmsgs* msgs);
60  ExprPtr unqualify (const TEnvPtr& tenv, const ConstraintPtr& cst, const ExprPtr& e, Definitions* ds) const;
61  PolyTypePtr lookup (const std::string& vn) const;
62  SymSet bindings () const;
63  FunDeps dependencies(const ConstraintPtr&) const;
64 
65  // the member type in the implied context of this class's qua[nt|l]ification
66  // (normally you should use 'lookup' to get fully qualified types)
67  MonoTypePtr memberType(const std::string& vn) const;
68 
69  // show this class definition
70  void show(std::ostream&) const;
71 public:
72  const TCInstances& instances() const;
73  bool hasGroundInstanceAt(const MonoTypes&) const;
74  const TCInstanceFns& instanceFns() const;
75 private:
76  friend class TCInstanceFn;
77 
80 
81  std::string tcname;
82  int tvs;
84  Members tcmembers;
86  TCInstances tcinstances;
87  TCMonoInstDB tcinstdb;
88  TCInstanceFns tcinstancefns;
89  TCInstFnDB tcinstfndb;
90 
91  void candidateTCInstFns(const TEnvPtr&, const MonoTypes&, TCInstanceFns*) const;
92 
93  bool refine(const TEnvPtr& tenv, const ConstraintPtr& c, const FunDep& fd, MonoTypeUnifier* s, Definitions* ds) const;
94 
95  // to support recursive types, track recursive invocations and assume they're satisfiable
97  mutable TestedInstances testedInstances;
98 
99  // cache satisfiability tests
100  mutable TestedInstances satfInstances;
101 };
102 typedef std::shared_ptr<TClass> TClassPtr;
103 typedef std::map<std::string, TClassPtr> TClassEnv;
104 
106 public:
107  typedef std::shared_ptr<Expr> ExprPtr;
108 
109  TCInstance(const std::string& tcname, const MonoTypes& itys, const MemberMapping& mmap, const LexicalAnnotation&);
110 
111  size_t arity() const;
112  const MonoTypes& types() const;
113  const MemberMapping& memberMapping() const;
114  bool hasMapping(const std::string& oname) const;
115  const ExprPtr& memberMapping(const std::string& oname) const;
116 
117  void bind(const TEnvPtr&, const TClass*, Definitions*);
118 
119  bool matches(const TEnvPtr&, const MonoTypes&) const;
120 
121  ExprPtr unqualify(Definitions* ds, const TEnvPtr& tenv, const ConstraintPtr& cst, const ExprPtr& e) const;
122 
123  // show this instance definition
124  void show(std::ostream&) const;
125 private:
126  std::string tcname;
128  MemberMapping mmap;
129 };
130 
132 public:
133  TCInstanceFn(const std::string& tcname, const Constraints& reqs, const MonoTypes& itys, const MemberMapping& mmap, const LexicalAnnotation&);
134 
135  size_t arity() const;
136 
137  // can we immediately exclude this instance generator for this type list?
138  bool satisfiable(const TEnvPtr&, const MonoTypes&, Definitions*);
139 
140  // assuming we're not satisfiable, what are the constraints that aren't satisfiable?
141  void explainSatisfiability(const TEnvPtr&, const MonoTypes&, Definitions*, Constraints*, Constraints*);
142 
143  // (possibly) produce a type class instance from this generator
144  bool apply(const TEnvPtr& tenv, const MonoTypes& tys, const TClass* c, MonoTypeUnifier*, Definitions* rdefs, TCInstancePtr* out) const;
145 
146  // assuming that the input conditions are satisfied, what are the output args and member mapping?
147  MonoTypes instantiatedArgs(MonoTypeUnifier* s, const MonoTypes& tys) const;
148  MemberMapping members(const MonoTypeSubst&) const;
149 
150  // constraints that this generator depends on
151  const Constraints& constraints() const;
152 
153  // show this instance-generator definition
154  void show(std::ostream&) const;
155 
156  // produce a sequence of type variables and constraints unique to this invocation
157  typedef std::pair<Constraints, MonoTypes> IFnDef;
158  IFnDef freshDef(MonoTypeSubst* s) const;
159 private:
160  std::string tcname;
162  MemberMapping mmap;
163 public:
165  size_t order; // where does this instance function belong in its family?
166 };
167 
168 // utilities for testing satisfiability of arbitrary class constraints
169 bool isClassSatisfied(const TEnvPtr&, const std::string&, const MonoTypes&, Definitions*);
170 bool isClassSatisfiable(const TEnvPtr&, const std::string&, const MonoTypes&, Definitions*);
171 
172 ExprPtr unqualifyClass(const TEnvPtr&, const std::string&, const MonoTypes&, const ExprPtr&, Definitions*);
173 
174 // utility for generating new classes from existing ones
175 void definePrivateClass(const TEnvPtr& tenv, const std::string& memberName, const ExprPtr& expr);
176 bool isClassMember(const TEnvPtr& tenv, const std::string& memberName);
177 
178 // reverse private class constraints to find the leaf public constraints
180 
181 // temporarily support serialization of ground type class instances to avoid recomputation at startup
182 void serializeGroundClasses(const TEnvPtr&, std::ostream&);
183 void deserializeGroundClasses(const TEnvPtr&, std::istream&, Definitions*);
184 
185 // show class, instance, and instance-generator definitions
186 std::string show(const TClassPtr&);
187 std::string show(const TCInstancePtr&);
188 std::string show(const TCInstanceFnPtr&);
189 
190 }
191 
192 #endif
193 
std::vector< TCInstancePtr > TCInstances
Definition: class.H:26
std::shared_ptr< PolyType > PolyTypePtr
Definition: type.H:23
std::shared_ptr< TCInstanceFn > TCInstanceFnPtr
Definition: class.H:28
Definition: tyunqualify.H:20
Types types(const Constants &cs)
Definition: llvm.H:357
const FunDeps & deps() const
Definition: class.C:87
SymSet bindings() const
Definition: class.C:349
std::shared_ptr< TCInstance > TCInstancePtr
Definition: class.H:24
std::shared_ptr< Expr > ExprPtr
Definition: class.H:107
void explain(const TEnvPtr &tenv, const ConstraintPtr &cst, const ExprPtr &e, Definitions *ds, annmsgs *msgs)
Definition: class.C:258
FunDeps mergeFundeps(const FunDeps &lhs, const FunDeps &rhs)
Definition: class.C:17
TCInstances tcinstances
Definition: class.H:86
const TCInstances & instances() const
Definition: class.C:394
std::map< std::string, MonoTypePtr > Members
Definition: class.H:34
void show(std::ostream &) const
Definition: class.C:368
MemberMapping mmap
Definition: class.H:162
Definition: class.H:131
void candidateTCInstFns(const TEnvPtr &, const MonoTypes &, TCInstanceFns *) const
Definition: class.C:126
TClass(const Constraints &reqs, const std::string &tcname, int tvs, const Members &tcmembers, const LexicalAnnotation &)
Definition: class.C:62
Definition: class.H:32
const TCInstanceFns & instanceFns() const
Definition: class.C:402
Constraints reqs
Definition: class.H:83
std::map< std::string, ExprPtr > MemberMapping
Definition: class.H:21
bool satisfied(const TEnvPtr &tenv, const ConstraintPtr &cst, Definitions *ds) const
Definition: class.C:212
void apply(const transition_lookahead &tl, parserdef *p)
Definition: lalr.C:564
ExprPtr unqualify(const TEnvPtr &tenv, const ConstraintPtr &cst, const ExprPtr &e, Definitions *ds) const
Definition: class.C:321
std::set< std::string > SymSet
Definition: tyunqualify.H:12
TCInstFnDB tcinstfndb
Definition: class.H:89
Definition: boot.H:7
FunDeps fundeps
Definition: class.H:85
int tvs
Definition: class.H:82
void insert(const TEnvPtr &tenv, const TCInstancePtr &ip, Definitions *ds)
Definition: class.C:91
std::string tcname
Definition: class.H:160
std::vector< FunDep > FunDeps
Definition: tyunqualify.H:17
Definition: class.H:105
PolyTypePtr lookup(const std::string &vn) const
Definition: class.C:331
size_t order
Definition: class.H:165
std::string tcname
Definition: class.H:126
MonoType::ptr MonoTypePtr
Definition: type.H:71
ExprPtr unqualifyClass(const TEnvPtr &, const std::string &, const MonoTypes &, const ExprPtr &, Definitions *)
Definition: class.C:791
TestedInstances satfInstances
Definition: class.H:100
FunDeps inferFundeps(const TEnvPtr &tenv, const Constraints &cs)
Definition: class.C:43
const Members & members() const
Definition: class.C:83
std::vector< TCInstanceFnPtr > TCInstanceFns
Definition: class.H:30
FunDeps dependencies(const ConstraintPtr &) const
Definition: class.C:357
bool hasGroundInstanceAt(const MonoTypes &) const
Definition: class.C:398
MemberMapping mmap
Definition: class.H:128
std::pair< Constraints, MonoTypes > IFnDef
Definition: class.H:157
Constraints reqs
Definition: class.H:161
Definition: typeinf.H:29
std::vector< ConstraintPtr > Constraints
Definition: type.H:35
void deserializeGroundClasses(const TEnvPtr &, std::istream &, Definitions *)
Definition: class.C:870
void serializeGroundClasses(const TEnvPtr &, std::ostream &)
Definition: class.C:853
TCMonoInstDB tcinstdb
Definition: class.H:87
bool isClassSatisfiable(const TEnvPtr &, const std::string &, const MonoTypes &, Definitions *)
Definition: class.C:787
bool isClassMember(const TEnvPtr &tenv, const std::string &memberName)
Definition: class.C:802
Members tcmembers
Definition: class.H:84
MonoTypePtr memberType(const std::string &vn) const
Definition: class.C:340
std::shared_ptr< Expr > ExprPtr
Definition: expr.H:58
Constraints expandHiddenTCs(const TEnvPtr &, const Constraints &)
Definition: class.C:752
type_map< TCInstancePtr > TCMonoInstDB
Definition: class.H:78
void definePrivateClass(const TEnvPtr &tenv, const std::string &memberName, const ExprPtr &expr)
Definition: class.C:722
Definition: lannotation.H:36
std::map< std::string, TClassPtr > TClassEnv
Definition: class.H:103
std::shared_ptr< TEnv > TEnvPtr
Definition: type.H:80
int typeVars() const
Definition: class.C:79
Definition: lannotation.H:22
bool isClassSatisfied(const TEnvPtr &, const std::string &, const MonoTypes &, Definitions *)
Definition: class.C:783
std::string tcname
Definition: class.H:81
#define out
Definition: netio.H:19
std::pair< VarIDs, int > FunDep
Definition: tyunqualify.H:16
std::vector< Definition > Definitions
Definition: expr.H:62
const std::string & name() const
Definition: class.C:71
type_map< TCInstanceFns > TCInstFnDB
Definition: class.H:79
TCInstanceFns tcinstancefns
Definition: class.H:88
std::shared_ptr< Constraint > ConstraintPtr
Definition: type.H:33
MonoTypes itys
Definition: class.H:127
friend class TCInstanceFn
Definition: class.H:76
TestedInstances testedInstances
Definition: class.H:97
const Constraints & constraints() const
Definition: class.C:75
TCInstances matches(const TEnvPtr &tenv, const ConstraintPtr &c, MonoTypeUnifier *, Definitions *ds) const
Definition: class.C:122
std::shared_ptr< TClass > TClassPtr
Definition: class.H:102
bool satisfiable(const TEnvPtr &tenv, const ConstraintPtr &cst, Definitions *ds) const
Definition: class.C:224
std::vector< MonoTypePtr > MonoTypes
Definition: type.H:72
bool refine(const TEnvPtr &tenv, const ConstraintPtr &cst, MonoTypeUnifier *s, Definitions *ds)
Definition: class.C:170
MonoTypes itys
Definition: class.H:164
type_map< bool > TestedInstances
Definition: class.H:96
std::map< TVName, MonoTypePtr > MonoTypeSubst
Definition: type.H:143
std::vector< annmsg > annmsgs
Definition: lannotation.H:58