xo-reader2/xo-reader
2025-07-28 15:16:11 -04:00
..
cmake Add 'xo-reader/' from commit 'c46c0f1cc4' 2025-05-11 01:40:20 -05:00
docs xo-reader: + pretty-printing support [WIP] 2025-07-13 21:21:20 -05:00
examples refactor xo::ast -> xo::scm + restore nodef ppdetail_atomic build 2025-07-28 10:13:25 -04:00
include/xo/reader minor logging adds 2025-07-28 15:16:11 -04:00
src/reader minor logging adds 2025-07-28 15:16:11 -04:00
utest refactor xo::ast -> xo::scm + restore nodef ppdetail_atomic build 2025-07-28 10:13:25 -04:00
.gitignore Add 'xo-reader/' from commit 'c46c0f1cc4' 2025-05-11 01:40:20 -05:00
CMakeLists.txt xo-reader: + pretty-printing support [WIP] 2025-07-13 21:21:20 -05:00
README xo-expression xo-reader: type unifier + misc improvements 2025-07-26 17:28:41 -04:00

1. in parser we need.. type unification?
2. or perhaps just need to introduce type variables.

3. we can't resolve type for a recursive pair of functions until we've seen both of them..
   tho we could require letrec

def foo = lambda (n : i64) { let (n == 0) then 1 else n * foo(n - 1); };

strategy:
----------

while parsing def, instead of creating DefineExpr with nullptr TypeDescr:
a. create DefineExpr with TypeVariable.
(We have to do this because can't tell nullptr's apart,..)

- generalize xo::reflect::TypeDescrBase

// compose these into Expressions.
//
struct type_ref {
  bool is_concrete() const { return td_ && td_->is_concrete(); }

  // generated name, so we can map between types.  Don't want to create TypeDescr
  // every time we have a typed location. there'd be a lot of them, and hard to collect
  flatstring<11> id_;
  // if TypeDescr is concrete (fully described), this describes it
  TypeDescr td_;
};

// what we know about a type
//
struct TypeBlueprint : public Refcounted {
  static bool equal(bp<TypeTemplate> lhs, bp<TypeTemplate> rhs);

  type_ref ref_;

  // additional descriptive info...
};

// effectively these are constraints?
//
using TypeSubstitutionMap = map<string, rp<TypeTemplate>>;

will have typeunifier in parserstatemachine

struct TypeUnifier {
   // extend as unification proceeds
   //
   TypeSubstitutionMap substitutions_;
};

alt strategy
-------------