diff --git a/LOG.md b/LOG.md index 5271d9a..7e51fd1 100644 --- a/LOG.md +++ b/LOG.md @@ -238,3 +238,38 @@ The final pipeline I ended up with was: I then created an `evaluator` function to wrap this up in the `eval` module, to allow for a simple interface to the whole library. + +## Conclusion / Closing thoughts + +Creating the differentiation program was a lot of fun, and I'm happy +with the result I ended up with. The code is well-tested, and for the +most part is fairly maintainable (perhaps with the area needing the +most work in that respect being the constant folding pass). + +In order to quantify how effective the test suite is, I ran a mutation +testing tool (`cargo-mutants`) and it found that only 3 out of 221 +generated mutants were missed by the test suite, giving a mutation +score of 98.6% which is very good. The three missed mutants were also +limited to the demo program itself (which makes sense since it has no +tests) and error message formatting code, so none of them are +particularly concerning. + +There are quite a lot of areas where further work could be done, such +as adding support for functions like sine, cosine and natural +logarithms; enhancing the simplification and canonicalisation passes +and allowing non-constant exponents. However, I think the most +interesting enhancement would be to add equalities to the language and +allow definitions to be stored within a session, with explicit +differentiation commands to get the deriviative of something, such as: + +``` +> y = x^3 - x^2 +> dy/dx +3x^2 - 2x +``` + +This, along with a few other features, would transform the program +into a more general-purpose symbolic mathematics engine, which would +be very cool and useful. The current architecture would allow for +this quite nicely, as evaluators are able to have mutable state which +could be used for storing variable bindings.