(1) The instantiation of 'Prelude.[]' list into the 'Dao.Binary.Binary' monad still had a mistake in the encoder/decoder was still not correct. I had used "Control.Applicative.many" which assumes that the decoder of the data type stored in the list will backtrack with 'Control.Monad.mzero' if the first byte fails, which is not always the case, and the null terminator byte at the end of the list was causing decoders to evaluate to 'Control.Monad.fail'. I re-implemented the decoder with a loop that first checks for a null terminator before evaluating the decoder.
(2) I realized that there was really no purpose to having a 'Dao.Binary.NullTerm' data type. It is easier just to implement null terminators as functions like 'Dao.Binary.getNullTerm' and 'Dao.Binary.putNullterm'.
(3) Instantiated the 'Dao.Binary.GGet' data type into the 'Control.Monad.Error.Class.MonadError' class, although I don't think I have any use for it yet.
Forgot to define the instance of 'Prelude.Show' for the 'Dao.Object.ORef' constructor. I should try to go back to using Haskell's "deriving" mechanism somehow, but it will be difficult with the 'OHaskell' constructor. (See latest notes in the TODO file).
Fixed bug: forgot to modify the decoder of ObjListExpr to make use of 'Dao.Binary.getUnwrapped' even after I had modified the encoder to make use of 'Dao.Binary.putUnwrapped'.
I had completely forgotten to implement a parser for 'Dao.Object.AST.AST_ArraySub'. The parser for this constructor starts off identically to the parsers for 'Dao.Object.AST.AST_FuncCall' and 'Dao.Object.AST.AST_Init', which had been factored together. I have re-factored those parsers all together now to make use of a new parse table with three elements: the tokens for the opening round "()", square "[]", and curly "{}" brackets, each of which signify a different constructor when followed by a successful parsing of an 'Dao.Object.AST.AST_QualRef' data type. I have also noticed that since these parsers are so similar, I should probably change 'Dao.Object.AST.AST_Init' so it takes an 'Dao.Object.AST.AST_QualRef' instead of just a 'Dao.Object.AST.AST_Ref' to make the syntax a bit more consistent and (hopefully) more intuitive.
Bug fix in pretty printer for 'Dao.Object.AST.AST_FuncCall'. Also, moved the instantiation of 'Dao.Object.AST.AST_ObjList' in the PPrintable class to a more general, ordinary, top-level function, and then re-defined the instantiation in terms of that top-level function.
Tweaked the whitespace.
Bug fix: instantiation of 'Dao.Object.AST.AST_Paren' into the 'Dao.Random.HasRandGen' class was generating objects with literal expressions that had the same pretty-printed representation as a non-equivalent object expression constructed without a literal expression, causing equivalence tests to fail needlessly.