Hi,

On Oct 26, 2:35 pm, Gorsal <s...@tewebs.com> wrote:

> Im attempting to create a named class inside another namespace like
> this:
>
> (ns ide.handlers
>   (:import [org.eclipse.ui.commands AbstractHandler]))
>
> (defmacro new-handler-class [n event & body]
>  `(do
>       (ns ~n
>         (:gen-class :extends
> ~'org.eclipse.ui.commands.AbstractHandler :init ~'init))
>       (defn ~'-init [] [[][]])
>       (defn ~'-execute [~'this ~event]
>         ~...@body)))
>
> (new-handler-class ide.KeyTest _
>   (.print System/out "HI"))
>
> However, when i (compile 'ide.handlers) it generate a class named
> KeyTest$_init_307.class along with KeyTest.class.
> When i attempt to launch, i get the following error
>
> Caused by: java.io.FileNotFoundException: Could not locate ide/
> KeyTest__init.class or ide/KeyTest.clj on classpath:
>
> So, apparently i need a KeyTest_init instead of a KeyTest$_init_307?
> Why in the heck is KeyTest.class not referring to the KeyTest
> $_init_307?  How do i get this to work? I don't want to create a new
> file per class name. And renaming the file doesn't work, i guess the
> class name is stored inside somewhere.

My suspicion is, that the problem is the nesting ns in the do. This at
least smells really hard. I would suggest to use simply gen-class
directly and define the functions in the containing namespace with a
suitable prefix.

(defmacro new-handler-class
  [classname-sym event & body]
  (let [classname        (name classname-sym)
        last-dot         (.lastIndexOf classname ".")
        simple-classname (if (not= last-dot -1)
                           (.substring classname (inc last-dot))
                           classname)
        prefixed         #(symbol (str simple-classname "-" %))
        hinted-this      (with-meta 'this {:tag classname-sym})]
    `(do
       (gen-class
         :name    ~classname-sym
         :extends org.eclipse.ui.commands.AbstractHandler
         :prefix  ~(symbol (str simple-classname "-"))
         :init    ~'init
         :main    false)
       (defn ~(prefixed "init")
         []
         [[] []])
       (defn ~(prefixed "execute")
         [~hinted-this ~event]
         ~...@body))))

The functions will live in the calling namespace with a suitable
prefix, eg. foo.bar.Baz => Baz-execute.

Not tested but should come close.

Sincerely
Meikel

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to