Welcome! Please see the About page for a little more info on how this works.

0 votes
in ClojureScript by

In ClojureScript, using {{ns-unmap}} on a symbol from {{cljs.core}} doesn't exclude it from the current namespace. Note that both a function and a macro still exist, even after unmapping:

To quit, type: :cljs/quit cljs.user=> (ns-unmap 'cljs.user 'when) ;; macro true cljs.user=> (ns-unmap 'cljs.user 'not) ;; function true cljs.user=> (when 1 2) 2 cljs.user=> (not false) true

This differs from the behavior of Clojure's {{ns-unmap}}. Note the appropriate errors when attempting to use unmapped symbols:

Clojure 1.7.0-beta1 user=> (ns-unmap 'user 'when) ;; macro nil user=> (ns-unmap 'user 'not) ;; function nil user=> (when 1 2) CompilerException java.lang.RuntimeException: Unable to resolve symbol: when in this context, compiling:(NO_SOURCE_PATH:11:1) user=> (not false) CompilerException java.lang.RuntimeException: Unable to resolve symbol: not in this context, compiling:(NO_SOURCE_PATH:12:1)

Somehow ClojureScript's {{ns-unmap}} needs to add the symbol to the current namespace's {{:excludes}} set. Note that the {{def}} special form does this already (after it displays a warning).

We have two solutions. 0001 extends the {{ns}} form's {{:merge}} behavior to support {{:excludes}}, and then uses this in {{ns-unmap}}. If the enhancement to {{ns}} isn't wanted, patch 0002 changes {{ns-unmap}} to update {{:excludes}} directly.

4 Answers

0 votes
by

Comment made by: dnolen

The second patch is preferred. However it seems the second patch is too permissive. The {{:excludes}} logic should only be applied if the symbol identifies a core macro or fn.

0 votes
by

Comment made by: chouser@n01se.net

The ns form's own :refer-clojure :exclude accepts arbitrary symbols and adds them to the namespace's :excludes set, which seems like the same permissiveness problem. Do you want a patch that addresses the permissiveness of both ns and ns-unmap in this ticket, or should such a patch go in a new ticket?

0 votes
by

Comment made by: dnolen

New ticket to fix the bug that {{:exclude}} doesn't check the symbol list for {{cljs.core}} declared vars, and an updated patch here please.

0 votes
by
Reference: https://clojure.atlassian.net/browse/CLJS-1237 (reported by chouser@n01se.net)
...