Yes, this is expected. Similar issue exists with kws with unknown aliases
in reader conditionals.
user=> #?(:clj 10 :cljs 5)
10
user=> #?(:clj 10 :cljs ::foo/bar)
RuntimeException Invalid token: ::foo/bar
clojure.lang.Util.runtimeException (Util.java:221)
Autoresolved keywords inherently require knowledge of the environment to do
the "autoresolve" part during read (and all of these things require read).
There is a way around this though because as of 1.9, the namespace resolver
in LispReader is pluggable by setting the dynamic var *reader-resolver* to
an implementation of LispReader$Resolver. If you wanted, you could make
this tolerant (at the risk of maybe allowing other stuff you shouldn't).
user=> (def resolver (reify clojure.lang.LispReader$Resolver
(currentNS [_] (.-name *ns*))
(resolveClass [_ sym] sym)
(resolveAlias [_ sym] sym) ;; never fail
(resolveVar [_ sym] sym)))
#'user/resolver
user=> (read-string "[#_::fooo/bar]")
RuntimeException Invalid token: ::fooo/bar
clojure.lang.Util.runtimeException (Util.java:221)
user=> (binding [*reader-resolver* resolver] (read-string "[#_::fooo/bar]"))
[]
It's unlikely this is worth the trouble for something like this but it
helps fill in some gaps.
On Wednesday, August 22, 2018 at 7:32:51 PM UTC-5, Robert P. Levy wrote:
>
> I wouldn't consider this a bug or even an unfortunate behavior
> necessarily, but potentially surprising and worth mentioning. The comment
> reader macro #_ works just fine as long as nothing breaks the reader. The
> surprise happens when you don't consider that for namespaced keywords using
> ns aliases, the namespace resolution happens at reader-macro expansion
> time, prior to evaluation. As a logical consequence of this is that
> seemingly commented out code will fail at read-time if the ns alias or
> namespace doesn't exist.
>
> Clojure repro:
>
> user=> (println #_(::fooo/bar))
>
> RuntimeException Invalid token: ::fooo/bar
> clojure.lang.Util.runtimeException (Util.java:221)
> RuntimeException Unmatched delimiter: )
> clojure.lang.Util.runtimeException (Util.java:221)
> user=> RuntimeException Unmatched delimiter: )
> clojure.lang.Util.runtimeException (Util.java:221)
>
> ClojureScript repro:
>
> cljs.user=> (println #_(::fooo/bar))
>
> cljs.user=> clojure.lang.ExceptionInfo: [line 1, col 23] Invalid keyword:
> ::fooo/bar. {:type :reader-exception, :ex-kind :reader-error, :file nil,
> :line 1, :col 23}
> at clojure.core$ex_info.invokeStatic(core.clj:4739)
> at clojure.core$ex_info.invoke(core.clj:4739)
> at clojure.tools.reader.impl.errors$throw_ex.invokeStatic(errors.clj:34)
> at clojure.tools.reader.impl.errors$throw_ex.doInvoke(errors.clj:24)
> ...
>
--
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.