Switch to using type schemes and implement polymorphism in compiler series

This commit is contained in:
2020-03-24 23:04:44 -07:00
parent e07da0c9b1
commit de435d6c80
6 changed files with 93 additions and 9 deletions

View File

@@ -1,6 +1,8 @@
#pragma once
#include <memory>
#include <map>
#include <vector>
#include <set>
struct type_mgr;
@@ -12,6 +14,18 @@ struct type {
using type_ptr = std::shared_ptr<type>;
struct type_scheme {
std::vector<std::string> forall;
type_ptr monotype;
type_scheme(type_ptr type) : forall(), monotype(std::move(type)) {}
void print(const type_mgr& mgr, std::ostream& to) const;
type_ptr instantiate(type_mgr& mgr) const;
};
using type_scheme_ptr = std::shared_ptr<type_scheme>;
struct type_var : public type {
std::string name;
@@ -62,4 +76,5 @@ struct type_mgr {
void unify(type_ptr l, type_ptr r);
type_ptr resolve(type_ptr t, type_var*& var) const;
void bind(const std::string& s, type_ptr t);
void find_free(const type_ptr& t, std::set<std::string>& into) const;
};