<div dir="ltr">I wrote a first draft of the spec for the proposal (<a href="https://github.com/raulsebastianmihaila/ecma262-definition-mixins-proposal" target="_blank">https://github.com/raulsebast<wbr>ianmihaila/ecma262-definition-<wbr>mixins-proposal</a>). In some cases I'm not certain about the accuracy of the spec and I also cut the corners in a few places. There are 2 versions. The second version only contains the differences from the first version. Version 1 is simpler. Version 2 uses indirect bindings in a mixin function provider call and these semantics don't exist in the language. I didn't try to spec them as I thought it would be challenging (probably involving creating a new kind of function). If this is not pragmatic it's fine, version 1 doesn't have indirect bindings. I like version 2 a bit more, but version 1 would work as well.<div><div><br></div><div>Any feedback from people from TC39 or people interested in mixins is appreciated.</div></div><div><br></div><div><div>Compare the following two fragments, one with current ES syntax/semantics, and the other one with the mixin syntax/semantics (from the first simpler version of the spec).</div><div><br></div><div>```js</div><div>const mix = {</div><div>  kings: {},</div><div>  currentMove</div><div>};</div><div>let promotingPawn = null;</div><div>const board = boardMixin.create();</div><div><br></div><div>board.currentSide = null;</div><div>board.isPromoting = false;</div><div>board.isCheckmate = false;</div><div>board.isStalemate = false;</div><div>board.isDraw = false;</div><div><br></div><div>const isSafeMove = mix.isSafeMove = boardMixin.isSafeMove(mix);</div><div>const setBoardResolution = mix.setBoardResolution = boardMixin.setBoardResolution(board, mix);</div><div><br></div><div>board.isSquareAttacked = boardMixin.isSquareAttacked(board);</div><div>board.getPiece = boardMixin.getPiece(board);</div><div>```</div><div><br></div><div>```js</div><div>const mixState = {</div><div>  kings: {},</div><div>  currentMove</div><div>};</div><div>let promotingPawn = null;</div><div>const board = boardMixin.create();</div><div><br></div><div>board.currentSide = null;</div><div>board.isPromoting = false;</div><div>board.isCheckmate = false;</div><div>board.isStalemate = false;</div><div>board.isDraw = false;</div><div><br></div><div>mixin board:</div><div>  boardMixin.isSafeMove,</div><div>  boardMixin.setBoardResolution:</div><div>    mixState;</div><div><br></div><div>mixin on board:</div><div>  boardMixin.isSquareAttacked,</div><div>  boardMixin.getPiece;</div></div><div>```</div></div>