#pragma once #include #include #include namespace lily { class type_manager; class type_env; struct type; struct pattern { virtual ~pattern() = default; virtual type* check_modifying(type_manager& mgr, std::shared_ptr env) = 0; }; typedef std::unique_ptr pattern_ptr; struct pattern_var : pattern { std::string name; pattern_var(std::string n) : name(std::move(n)) {} ~pattern_var() = default; type* check_modifying(type_manager& mgr, std::shared_ptr env); }; struct pattern_cons : pattern { std::string name; std::vector vnames; pattern_cons(std::string n) : name(std::move(n)) {} ~pattern_cons() = default; type* check_modifying(type_manager& mgr, std::shared_ptr env); }; }