hobbes
a language, embedded compiler, and runtime for efficient dynamic expression evaluation, data storage and analysis
appendsto.H
Go to the documentation of this file.
1 
2 #ifndef HOBBES_LANG_TYPEPREDS_APPENDSTO_HPP_INCLUDED
3 #define HOBBES_LANG_TYPEPREDS_APPENDSTO_HPP_INCLUDED
4 
6 
7 namespace hobbes {
8 
9 // an 'appendsto' constraint ensures that two types can be 'appended' to a third type
10 // A++B=C | A B -> C, B C -> A, A C -> B
11 // e.g.:
12 // {x:int}++{y:int}=C [C = {x:int,y:int}]
13 // A++{y:int}={x:int,y:int} [A = {x:int}]
14 // {x:int}++B={x:int,y:int} [B = {y:int}]
15 struct AppendsTo {
19 };
20 bool dec(const ConstraintPtr&, AppendsTo*);
21 
22 // an "appendsto eliminator" knows how to resolve an "AppendsTo" constraint at a particular (category of) type
23 struct ATEliminator {
24  // is this AT instance eliminable?
25  virtual bool satisfied(const TEnvPtr& tenv, const MonoTypePtr& lhs, const MonoTypePtr& rhs, const MonoTypePtr& result) const = 0;
26 
27  // is it possible for this AT instance to eventually be eliminated?
28  virtual bool satisfiable(const TEnvPtr& tenv, const MonoTypePtr& lhs, const MonoTypePtr& rhs, const MonoTypePtr& result) const = 0;
29 
30  // refine the substitution set associated with this constraint
31  virtual bool refine(const TEnvPtr& tenv, const MonoTypePtr& lhs, const MonoTypePtr& rhs, const MonoTypePtr& result, MonoTypeUnifier* s) = 0;
32 
33  // unqualify a constraint (satisfied() must have returned true)
34  virtual ExprPtr unqualify(const TEnvPtr&, const ConstraintPtr&, const ExprPtr&, Definitions*) const = 0;
35 
36  // allow overloaded functions to be defined at each eliminator type
37  virtual PolyTypePtr lookup(const std::string& vn) const = 0;
38  virtual SymSet bindings() const = 0;
39 };
40 
41 // a 'field verifier' is a scheme for validating types as containing a named field somehow
43 public:
45  static std::string constraintName();
46 
47  // extend the set of 'appendsto' eliminators dynamically (dangerous?)
48  void addEliminator(ATEliminator*);
49 
50  // unqualifier interface
52  bool satisfied(const TEnvPtr&,const ConstraintPtr&,Definitions*) const;
53  bool satisfiable(const TEnvPtr&,const ConstraintPtr&,Definitions*) const;
54  void explain(const TEnvPtr& tenv, const ConstraintPtr& cst, const ExprPtr& e, Definitions* ds, annmsgs* msgs);
55  ExprPtr unqualify(const TEnvPtr&,const ConstraintPtr&, const ExprPtr&, Definitions*) const;
56  PolyTypePtr lookup (const std::string& vn) const;
57  SymSet bindings () const;
58  FunDeps dependencies(const ConstraintPtr&) const;
59 private:
60  typedef std::vector<ATEliminator*> ATEliminators;
61  ATEliminators eliminators;
62 
63  ATEliminator* findEliminator(const TEnvPtr&, const AppendsTo*) const;
64 };
65 
66 }
67 
68 #endif
69 
std::shared_ptr< PolyType > PolyTypePtr
Definition: type.H:23
Definition: tyunqualify.H:20
Definition: appendsto.H:15
bool satisfied(const UnqualifierPtr &, const TEnvPtr &, const ConstraintPtr &, std::vector< std::pair< std::string, std::shared_ptr< Expr > > > *)
bool satisfiable(const UnqualifierPtr &, const TEnvPtr &, const ConstraintPtr &, std::vector< std::pair< std::string, std::shared_ptr< Expr > > > *)
MonoTypePtr leftType
Definition: appendsto.H:16
std::set< std::string > SymSet
Definition: tyunqualify.H:12
Definition: boot.H:7
MonoTypePtr rightType
Definition: appendsto.H:17
std::vector< FunDep > FunDeps
Definition: tyunqualify.H:17
MonoType::ptr MonoTypePtr
Definition: type.H:71
std::vector< ATEliminator * > ATEliminators
Definition: appendsto.H:60
Definition: typeinf.H:29
std::shared_ptr< Expr > ExprPtr
Definition: expr.H:58
ATEliminators eliminators
Definition: appendsto.H:61
bool dec(const ConstraintPtr &, AppendsTo *)
Definition: appendsto.C:15
std::shared_ptr< TEnv > TEnvPtr
Definition: type.H:80
std::vector< Definition > Definitions
Definition: expr.H:62
Definition: appendsto.H:42
uint32_t result
Definition: regex.C:376
std::shared_ptr< Constraint > ConstraintPtr
Definition: type.H:33
Definition: appendsto.H:23
bool refine(const TEnvPtr &tenv, const ConstraintPtr &c, MonoTypeUnifier *s, Definitions *)
Definition: typeinf.C:485
MonoTypePtr resultType
Definition: appendsto.H:18
T lookup(const std::map< K, T > &tenv, const K &n)
Definition: cc.C:518
std::vector< annmsg > annmsgs
Definition: lannotation.H:58