On Wed, Dec 2, 2015 at 8:11 AM, gianluca torta <[email protected]> wrote:
> for some reason, it looks like the implementation of the ns macro assumes
> that the macro itself is being defined in namespace clojure.core
>
> try defining myns in the namespace clojure.core, and it should work
>
Thanks, Gianluca. I tried that but def macros don't seem to respect
rebinding *ns*.
(ns foo)
(println *ns*) ;; => #object[clojure.lang.Namespace 0x73eb2c69 foo]
(binding [*ns* (create-ns 'clojure.core)]
(println *ns*) ;; => #object[clojure.lang.Namespace 0x255f1d1
clojure.core]
(def bar "i should be in clojure.core!")
(println (var bar))) ;; => #'foo/bar
I also tried in-ns and with-redefs to no avail.
Interning seems to work:
(ns foo)
(defmacro co-ns
... code from clojure.core/defmacro ns...)
(intern 'clojure.core (with-meta 'co-ns {:macro true}) @#'co-ns)
This puts the co-ns macro in clojure.core, but I still have to qualify the
call: foo/co-ns or clojure.core/co-ns. I haven't been able to get (co-ns
...) to work at top of file, but maybe it's better to qualify it anyway.
In the end it's embarrasingly simple:
;; foo.clj
(ns foo)
(defmacro co-ns
[name & references]
;; customizing code here...
(doseq [ref references] (println ref))
`(ns ~name ~@references)
;; ... and here
(println "hello CONS"))
(intern 'clojure.core (with-meta 'co-ns {:macro true}) @#'co-ns)
and the interning bit isn't even necessary. This makes it easy to add ref
keywords, e.g. (foo/co-ns (:require ...) (:my-ref ...))
Thanks,
Gregg
--
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.