Nicola, of course you're right.
I recently switched to the 3-ary analyze in order to use :validate/wrong-tag-handler and I was wrongly passing {} as the env, instead of (empty-env). When I saw the "Invalid token: ::a/b" errors I was fooled into thinking they were purely syntactical errors (but still -- that would be the reader, as you said), and didn't check the environment. (btw, I'm using my own analyze-ns because I'm interested in trying to go ahead even if the evaluation of some top-level form fails) Sorry for the noise, and thanks again for your work Francesco On Tuesday, August 19, 2014 10:18:56 PM UTC+2, Nicola Mometto wrote: > > > Francesco, > that doesn't seem to be the case in my tests: > > [~/src/tools.analyzer.jvm/src/main/clojure]> cat test.clj > (ns test (:require [clojure.string :as s])) > ::s/foo > > clojure.tools.analyzer.jvm> (-> (analyze-ns 'test) last :form) > :clojure.string/foo > > Note that to analyze keywords in the form ::foo/bar, *ns* has to be set > and all the aliases need to be setup, this can only happen if the ns > form is evaluated after being analyzed, using analyze+eval or analyze-ns > directly, there's an explaination on the tools.analyzer.jvm README > regarding why `analyze` shouldn't be used to analyze whole namespaces > and why you whould use analyze+eval or analyze-ns instead. > > In any case, keywords in the form ::foo/bar are resolved by the reader, > not the analyzer. > > Nicola > > Francesco Bellomi writes: > > > 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.