Hi,

> because the symbol's namespace is then nil, and you still can't tell if
> they're shadowing it with a let binding, or have renamed it with :as.
> 

  If the namespace is nil then its either been :used or :required. You 
could check ns-refers to see if its been :used. If its been shadowed
the symbol will appear in &env. But, as you suggested, checking for the 
var may be easier and sufficient as well. 
  That said, neither method is really composable. If the symbol usually 
represents a normal function, the user may wrap it in a helper or 
otherwise use it in a way that the symbol is not visible. In that case a 
macro will never be able to find it.
  It may be easier (for the implementor and consumers) to make it a 
special form, like recur when used in a loop or function body. 
YMMV.

- Andy

On Tuesday 03 August 2010 23:39:46 Kyle Schaffrick wrote:
> On Mon, 2 Aug 2010 07:23:12 -0400
> 
> Andrew Boekhoff <boekho...@gmail.com> wrote:
> > On Sunday 01 August 2010 21:34:16 Kyle Schaffrick wrote:
> > > Hello,
> > > 
> > > I'm trying to write a library with two main parts. The first is a
> > > macro, I'll call it 'with-feature, that walks through forms passed
> > > inside it, and any time it sees a call to another function in my
> > > library, 'feature, do some transformations.
> > > 
> > > The problem I'm concerned about is as follows: When my macro 
sees
> > > the forms that are passed into it, the symbols come in however 
the
> > > consumer of the library wrote them. So say I :require my library 
and
> > > alias it to 'mylib', then the call 'with-feature is looking for
> > > appears as 'mylib/feature. Or, I could :use the library, and then it
> > > would appear as 'feature, or I could alias 'feature to 'banana--you
> > > get the idea.
> > > 
> > > I don't want to reserve some magic symbol name that defies 
namespace
> > > rules, so that if the library consumer code uses the symbol 
'feature
> > > to mean something different, they get bizarre results.
> > > 
> > > What is a good pattern for writing the "matching" logic in such a
> > > selectively-transforming macro so that it can properly find the
> > > magic call it's looking for in the presence of normal namespacing
> > > behavior?
> > > 
> > > Thanks,
> > > 
> > > -Kyle
> > 
> > Hi,
> > 
> >   The following technique seems to work for finding out if you've
> > 
> > been aliased:
> > 
> > (ns somewhere.trial)
> > 
> > (let [here *ns*]
> > 
> >   (defmacro whats-my-name []
> >   
> >      (some (fn [[k v]] (when (= here v) `(quote ~k)))
> >      
> >                 (ns-aliases *ns*))))
> > 
> > user> (require '[somewhere.trial :as aliased]) =>
> > user> (aliased/whats-my-name)                     => aliased
> > 
> > So at the top of with-feature the parser could check for an alias and
> > construct the appropriate predicate from the result.
> > 
> > -Andy
> 
> I originally had something similar to this actually, but it doesn't work
> for the case when the library is referred in the consumer code with 
:use
> because the symbol's namespace is then nil, and you still can't tell if
> they're shadowing it with a let binding, or have renamed it with :as.
> 
> However, this idea occurred to me yesterday. What if I check to see if
> the symbol is pointing to the *var* containing my magic function,
> instead of trying to examine the symbol itself? e.g.:
> 
>   (= (resolve symbol-i-am-scanning-in-my-macro)
>      #'function-i-am-looking-for)
> 
> It seems to work, since at macro-expand time *ns* is bound to the
> consumer code's namespace. Does this seem like a reasonable way to 
deal
> with this?
> 
> -Kyle

-- 
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