Nicola, thank you for your work, and for :validate/wrong-tag-handler specifically, which is very useful to me.
It seems that analyzer refuses keywords in the form ::a/b, which are used in some projects (e.g. [org.clojure/core.typed] clojure.core.typed.check.fn contains ::t/cmethods at line 21). Francesco On Wednesday, August 13, 2014 6:54:54 PM UTC+2, Nicola Mometto wrote: > > > As some of you might know, I've been working contiuously on my various > tools.* contrib libraries for the past months and I've recently added > tools.analyzer.js to the list of contrib libraries I maintain. > > Since I don't blog/tweet much about those libraries, I thought I'd write > a report to let the community aware of the status of those libraries. > > ## tools.analyzer https://github.com/clojure/tools.analyzer > > tools.analyzer is a host-agnostic pluggable analyzer and collection of > passes producing an AST in clojure data structures for clojure and > other languages in the clojure language family, like clojurescript. > > The current release is 0.5.1, here's a list of notable changes that have > made in in the last few months: > > * The analyzer now uses different environments for lexical state (like > the locals map) and for global state (like namespaces mappings); the > former is just a regular map passed to an analyze call, the latter is > a dynamic var holding an atom and lives in the tools.analyzer.env > namespace along with functions to setup/manipulate it. > > * The metadata elision mechanism has been vastly improved, allowing to > specify different keys to elide based on the node :op, aswell as based > on a predicate rather than simple key matching. > > * The env context now partecipates in a keyword hierarchy, the default > contexts are :ctx/statement, :ctx/return and :ctx/expr and other > contexts can be derived from those, as an example tools.analyzer > utilizes :ctx.invoke/target and :ctx.invoke/params for nodes in invoke > position. > > * Dispatch on clojure expressions types has been opened with the > -analyze-form multimethod, allowing to provide custom evaluation > strategies for custom types (this was needed for tools.analyzer.js > because of clojurescript's #js syntax) > > * Documentation has been vastly improved with docstrings for every > public function and pass, and the addition of an official AST > quickref http://clojure.github.io/tools.analyzer/spec/quickref.html > > For a complete list of changes, refer to the CHANGELOG: > https://github.com/clojure/tools.analyzer/blob/master/CHANGELOG.md > > For more informations and examples, refer to the README: > https://github.com/clojure/tools.analyzer/blob/master/README.md > > ## tools.analyzer.jvm https://github.com/clojure/tools.analyzer.jvm > > tools.analyzer.jvm is a jvm-specific tools.analyzer extension, > collection of passes and useful functions to deal with analysis of > clojure on the JVM code. > > The current release is 0.5.2, here's a list of notable changes that have > made in the last few months: > > * Added an analyze-ns function that returns a vector of AST nodes for > every top-level form in that namespace; evaluates each form. > > * Added a configurable handler for wrong tags: while Clojure is > permissive of type hints that don't resolve to a Class which it > simply ignores in most cases, tools.analyzer.jvm's default behaviour > has always been to throw an exception in those cases. This has been a > longstanding issue for tools like eastwood that want to simply emit a > warning on those cases rather than stopping analysis and error out. > With the addition of this handlers, users can now control what happens > when t.a.jvm hits a tag that can't be resolved to a Class. > > * Added optional Var-level tag inference > > * Improved analyze+eval to attach the result of the evaluation of the > node to the AST, wrapping potential exceptions at evaluation time in > an ExceptionThrown record. > > * Documentation has been vastly improved with docstrings for every > public function and pass, and the addition of an official AST > quickref http://clojure.github.io/tools.analyzer.jvm/spec/quickref.html > > For a complete list of changes, refer to the CHANGELOG: > https://github.com/clojure/tools.analyzer.jvm/blob/master/CHANGELOG.md > > For more informations and examples, refer to the README: > https://github.com/clojure/tools.analyzer.jvm/blob/master/README.md > > ## tools.analyzer.js https://github.com/clojure/tools.analyzer.js > > tools.analyzer.js is a js-specific tools.analyzer extension, collection > of passes and useful functions to deal with analysis of clojurescript > code. > > The current release is 0.1.0-beta4. > > The produced AST is not compatible with the one produced by > cljs.analyzer even though they are similar as the cljs analyzer heavily > influenced the AST format of tools.analyzer. > tools.analyzer.js has several advantages over cljs.analyzer: > > * Heavily modular implementation, thanks to the :children-walking based > multi-pass design. > > * Unified AST format and analyzer interface between clj and cljs code > analyzers, this will allow library authors to write passes that can be > shared between different analyzers and write code that will work for > both clj and cljs with only minimal changes. > > * Caching of the namespace env: because of its multi-pass nature, t.a.js > is a bit slower than the (mostly) single-pass cljs.analyzer, to > compensate for this, t.a.js offers a mechanism of storing on disk & > reloading the namespace map and bundles the namespace map of cljs.core > so that it's not necessary to analyze it each time at startup like > with cljs.analyzer. > > For a complete list of changes, refer to the CHANGELOG: > https://github.com/clojure/tools.analyzer.js/blob/master/CHANGELOG.md > > For more informations and examples, refer to the README: > https://github.com/clojure/tools.analyzer.js/blob/master/README.md > > ## tools.emitter.jvm https://github.com/clojure/tools.analyzer.jvm > > tools.emitter.jvm is a bytecode compiler for clojure, that uses > tools.analyzer.jvm as its frontend. > > The current release is 0.1.0-beta5, currently the compiler has been > tested and is working on clojure.core and most clojure namespaces from > the standard library and the contrib libraries, in the last few months > several enhancements to how the compiler works internally and regarding > the emitted bytecode have been committed, for example: > > * A complete refactor of the internal emit and emit-class functions to > be more functional and stateless, thanks to Reid McKenzie. > > * The emitted bytecode clears the "this" local before tail calls, see > http://dev.clojure.org/jira/browse/CLJ-1250 for the issue this solves. > > * The emitted code hoists try/loop bodies in a different method rather > than wrappping them in a fn*, see > http://dev.clojure.org/jira/browse/CLJ-701 for the issue this solves; > the implementation in t.e.jvm is more general than the one implemented > for the clojure compiler. > > * Improved the load and eval functions to take an optional options map > with options that can be propagated from load to eval, and from eval > to the analyzer. > > For a complete list of changes, refer to the CHANGELOG: > https://github.com/clojure/tools.emitter.jvm/blob/master/CHANGELOG.md > > For more informations and examples, refer to the README: > https://github.com/clojure/tools.emitter.jvm/blob/master/README.md > > > If you've made it this far and have any question or comment, > please let me know and I'll be more than happy to reply. > > Nicola > -- 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.