Hi,

I'm porting expectations (https://github.com/jaycfields/expectations) to 
ClojureScript and may have encountered a compiler bug along the way. An 
expectations test looks like this:

(expect expected actual), 

where expect is a macro that produces a def with a generated symbol as its 
name.  

When a macro generates a def and its name contains a generated symbol, the 
corresponding var wouldn't contain all metadata and would deref to nil 
(weirdly, it'd still have some of the properties like :file and :line). 
See the minimal case here: https://github.com/imikushin/metabug


Consider the following macros:

(defmacro assume-named [name a]
  (assert (symbol? name) (str name))
  `(def ~(vary-meta name assoc :test `(with-meta (fn []) {:assumption true}))
     (fn [] (assert ~a (str '~a " => " ~a)))))

(defmacro assume [a]
  `(assume-named ~(gensym "assume") ~a))


If we try to obtain a collection of vars for a namespace, containing 
applications of assume, like

    (assume (= 3 (+ 1 2)))

we'd get vars that would deref to nil and would have metadata looking like 
something like this:

    {:arglists (), :test nil, :name assume5369, :column 1, :line 4, :file 
/home/ivan/src/clojure/metabug/test/metabug/gen_test.cljs, :doc nil, :ns 
metabug.gen-test}


But, if we use assume-named, like this

    (assume-named test-numbers-equal (= 3 (+ 1 2)))

we'd get a var with (something like) the following metadata:

    {:arglists (), :test #<[object Object]>, :name test-numbers-equal, :column 
1, :line 4, :file /home/ivan/src/clojure/metabug/test/metabug/named_test.cljs, 
:doc nil, :ns metabug.named-test}

If we further inspect it with (some-> the-var meta :test meta), we'd get
what's expected to be there: {:assumption true}. 

BTW, it doesn't matter if the generated name is (gensym "prefix") or 
something like (symbol (str "prefix" (swap! my-counter* inc))). 


If, instead, we use names composed entirely of static strings or symbols from 
the source file, the metadata is preserved and the vars get deref'ed correctly. 
E.g. the following macro produces "good" vars:

(defmacro assume-prefix-named [name a]
  (assert (symbol? name) (str name))
  `(assume-named ~(symbol (str "prefix-" name)) ~a))

-- 
Note that posts from new members are moderated - please be patient with your 
first post.
--- 
You received this message because you are subscribed to the Google Groups 
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/clojurescript.

Reply via email to