On Jul 29, 1:49 am, Sam Aaron <samaa...@gmail.com> wrote:
> On 29 Jul 2011, at 07:22, Ken Wesson wrote:
>
> > On Fri, Jul 29, 2011 at 12:49 AM, Jeff Rose <ros...@gmail.com> wrote:
> >> I don't think it's very typical to pass a form to a function, unless
> >> you plan on using eval at runtime.
>
> > Or it's a function called by a macro to do some processing of forms.
>
> Yep, this is precisely what I was considering. I should have explicitly made 
> mk-dynamically-bound-fn a macro in my example - a miscommunication on my part.
>
> On 29 Jul 2011, at 02:12, Alan Malloy wrote:
>
>
>
> > It's not clear how much of this is relevant to your actual problem, vs
> > the simple version you're posting here.
>
> Sorry, I was just trying to simplify things to try and get directly to the 
> meat of the problem.

No apologies needed - reducing to a simple case is great. But here,
the simplification was probably too severe.

> > If you want something more general, that implicitly binds things for
> > you based on some code somewhere else (ew ew ew), then you need a
> > macro. This implementation is pretty gross; I suspect it could be
> > better, but you're trying to do something that seems weird to me.
>
> > (defn binding-vec []
> >  ['size '(count args)])
>
> > (defmacro magic-fn
> >  [& forms]
> >  `(fn [& ~'args]
> >     (let ~(binding-vec)
> >       ~@forms)))
>
> > user> ((magic-fn (+ size 10)) 1 2)
> > 12
>
> Very cool, although it's not quite what I'd like. I'd like binding-vec to be 
> a function of the resulting magic-fn's args.
>
> I'm aiming for something like this, but can't get it to quite work:
>
> (defn binding-vec [foos]
>   '[size (count ~foos)])
>
> (defmacro magic-fn
>  [& forms]
>  `(fn [& ~'args]
>     (let ~(binding-vec ~'args)
>       ~@forms)))
>
> ((magic-fn (+ size 10)) 1 2) ;=> BOOM

(defn binding-vec [foos]
  ['size `(count ~foos)])

(defmacro magic-fn
  [& forms]
  (let [args (gensym 'args)]
    `(fn [& ~args]
       (let ~(binding-vec args)
         ~@forms))))

((magic-fn (+ size 10)) 1 2) ;=> 12

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