Gary Verhaegen <[email protected]> writes:
> Well, do actually means "execute all of the following forms, sequentially,
> at this point". It seems to me that the position of saying this also works
> when "this point" is the top-level is sensible.
Perhaps; what does not seem sensible is that it *only* works at
top-level. As I gave in my original email
(do (intern 'user 'x 1)
x)
works, but
(try
(do (intern 'user 'y 1)
y))
fails.
> I do not know what your actual use-case is, but, as Meikel said, it seems a
> bit strange to use intern if you know the symbol at compile time.
Yes, I didn't explain that.
So, I have a library which provides a load of "def" forms which all
intern. This is implemented through a macro which expands to a def form.
(defmacro intern-owl
"Intern an OWL Entity. Compared to the clojure.core/intern function this
signals a hook, and adds :owl true to the metadata. NAME must be a symbol"
([name entity]
;; we use def semantics here, rather than intern-owl-string, because
;; intern is not picked up by the compiler as defining a symbol
`(tawny.owl/run-intern-hook
(def ~(vary-meta name
merge
{:owl true})
~entity))))
As you can see, I add some metadata and run a hook function. This is my
main use case; it works because I know the symbol at compile time.
However, in a secondary use case, I do not know the symbol and have to
calculate it. It looks like this....
(defn intern-owl-string
"Interns an OWL Entity. Compared to the clojure.core/intern function this
signals a hook, and adds :owl true to the metadata. NAME must be a strings"
([name entity]
(tawny.owl/run-intern-hook
(intern *ns*
(with-meta
(symbol name)
{:owl true})
entity))))
So, now we have two problems. The first is that I have two nearly
identical functions. And the second, intern-owl-string will fail under
difficult to predict circumstances (for someone who does't know the guts
of the compiler).
As it happens, the second is mostly a pain during testing -- and I can
work around it -- this form for instance works okay.
(try (let [sym 'b] (intern 'user sym 1)(var-get (get (ns-publics *ns*) sym))))
and does the same as this.
(try (do (intern 'user 'y 1) y))
Phil
--
--
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/groups/opt_out.