- [X] Move to a struct-based primitive nodes rather than an enum based. - The problem with enum-based node is that it is quite difficult to extend with sub-classes - However, for structs it is as simple as making sure that, probably this needs some scary template-fu, which is not quite bad in itself. - [X] Implement visitors - [X] IdentityMapper - [X] Fold to a different type? - Like a StringifyMapper? - [X] Rewrite IdentityMapper using FoldableMapper? - Tried this and was unsuccessful. - This should mostly be done using macros. - [X] IdentityMapperWithContext - [X] MutIdentityMapper? - [X] CombineMapper - [X] CombineMapperWithContext - [X] WalkMapper - [X] DependencyMapper - [X] Force Expression to be derived from: - [X] ~std::fmt::Display~ - [X] ~std::cmp::Eq~ - [X] Probably all the mappers that we implement. - [X] String parsing. - [ ] Do the Binary Ops _have_ to to "binary", can they instead be rewritten to take arbitrary number of operands like pymbolic? - [ ] Parsing: needs helpful error messages. - Idea: We should probably implement something like IdentityMappers as derive macros. - [X] Implement get_dependencies - [ ] Implement substitute - [ ] Implement evaluate - [X] Make a deduplicating helper function - [X] Implement equality mapper - [X] Implement PartialEq trait for Rc - Not possible. - [X] Implement Bitwise Operators - [X] Implement Cached variants of mappers - [ ] Implement out sub-language as the `eval!` macro - [X] Add Continuous Integration - [X] StringifyMapper as Display and Repr for Debug. - [X] Repr should truncate results with ~(...)~. - [X] ~expression_trees~ is a terrible name, probably rename it to something else? - [X] Rename to SymOxide - [ ] Implement ~scalars!()~ which is similar to ~variables!~. - [ ] Start working on a design doc - [X] Visualize to graphviz - [X] Fix graphvix error detection.