> This PR adds experimental support for type-class based operator resolution. 
> This means that it is possible to define classes that "witness" some 
> numerical type class, like so:
> 
> 
> record Box(int i) {
>    __witness Integral<Box> INTEGRAL = ...
> }
> 
> 
> Then, we can start using `Box` in e.g. binary operations, like so:
> 
> 
> Box one = new Box(1);
> Box two = new Box(1);
> one + two // three
> 
> 
> In order to support type-class mediated operator resolution, we needed to add 
> a new kind of operator helper in `Operators`. These new operator helpers (one 
> for unary operators, one for binary operators) wrap some method in one of the 
> standard numeric classes -- for instance, type class `+` is realized through 
> `Numerical::add`, and so forth.
> 
> There's a new kind of operator symbol, namely `TypeClassOperatorSymbol` which 
> is used to store the type of the operation as well as the method symbol in 
> charge of performing the operation.
> 
> To resolve an operator, we basically have to prove that a witness for the 
> corresponding class, parameterized by the operand type exists. E.g. in the 
> above, we need to find a witness for `Numerical<Box>`.
> 
> During lowering, we emit such witness, and call the correct operator method 
> on it.
> 
> Note that support for assignment operators is also provided -- `Lower` 
> already has logic to lower some assignment operators into plain binary 
> operations, so we just leverage that support to translate type-class based 
> assignment ops.

Maurizio Cimadamore has updated the pull request incrementally with one 
additional commit since the last revision:

  Test cleanup

-------------

Changes:
  - all: https://git.openjdk.org/valhalla/pull/1948/files
  - new: https://git.openjdk.org/valhalla/pull/1948/files/6dedb1de..2b56b03d

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=valhalla&pr=1948&range=01
 - incr: https://webrevs.openjdk.org/?repo=valhalla&pr=1948&range=00-01

  Stats: 51 lines in 1 file changed: 2 ins; 1 del; 48 mod
  Patch: https://git.openjdk.org/valhalla/pull/1948.diff
  Fetch: git fetch https://git.openjdk.org/valhalla.git pull/1948/head:pull/1948

PR: https://git.openjdk.org/valhalla/pull/1948

Reply via email to