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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.