Specter is a library for querying and transforming nested data structures concisely and efficiently. The 0.11.0 release is a huge milestone that implements something which for the better part of the past year I wasn't sure was possible. In summary: now you don't have to do anything special to make Specter run fast. The prior work of manually precompiling your paths for performance is now seamlessly automated.
As part of the release, wrote up a detailed guide to how Specter achieves its high performance. Should also be an interesting read for anyone curious about the design of a very powerful Clojure library. https://github.com/nathanmarz/specter/wiki/Specter-0.11.0:-Performance-without-the-tradeoffs Note that there are some backwards incompatible changes in this release, so please read the changelog below. The core select/transform/etc. functions have changed to macros, and there have been some name updates to clean up the terminology. Updating your projects to the new changes should be very easy. Changes: * New `path` macro does intelligent inline caching of the provided path. The path is factored into a static portion and into params which may change on each usage of the path (e.g. local parameters). The static part is factored and compiled on the first run-through, and then re-used for all subsequent invocations. As an example, `[ALL (keypath k)]` is factored into `[ALL keypath]`, which is compiled and cached, and `[k]`, which is provided on each execution. If it is not possible to precompile the path (e.g. [ALL some-local-variable]), nothing is cached and the path will be compiled on each run-through. * BREAKING CHANGE: all `select/transform/setval/replace-in` functions changed to macros and moved to com.rpl.specter.macros namespace. The new macros now automatically wrap the provided path in `path` to enable inline caching. Expect up to a 100x performance improvement without using explicit precompilation, and to be within 2% to 15% of the performance of explicitly precompiled usage. * Added `select*/transform*/setval*/replace-in*/etc.` functions that have the same functionality as the old `select/transform/setval/replace-in` functions. * Added `must-cache-paths!` function to throw an error if it is not possible to factor a path into a static portion and dynamic parameters. * BREAKING CHANGE: `defpath` renamed to `defnav` * BREAKING CHANGE: `path` renamed to `nav` * BREAKING CHANGE: `fixed-pathed-path` and `variable-pathed-path` renamed to `fixed-pathed-nav` and `variabled-pathed-nav` * Added `must` navigator to navigate to a key if and only if it exists in the structure * Added `continous-subseqs` navigator * Added `ATOM` navigator (thanks @rakeshp) * Added "navigator constructors" that can be defined via `defnavconstructor`. These allow defining a flexible function to parameterize a defnav, and the function integrates with inline caching for high performance. -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.