Sorry, that one doesn't work. It worked in my repl, but I must have been
using old code.


On Wed, Aug 28, 2013 at 2:27 PM, Aaron Cohen <aa...@assonance.org> wrote:

> How about this alternative?
>
> (deftype Wrapper [f]
>   clojure.lang.IFn
>   (invoke [this] (f))
>   (invoke [this a] (f a))
>   ; repeat until you get bored
> )
>
> (defn e [f]
>   (let [wr (Wrapper. f)]
>     (eval `(~wr 1))))
>
> (e inc)
>
> (e (with-meta (fn [x] (+ 4 x)) {}))
>
>
>
> On Wed, Aug 28, 2013 at 1:59 PM, Jamie Brandon <
> ja...@scattered-thoughts.net> wrote:
>
>> That sort of works for my use case.
>>
>> What I want to do is define a grammar...
>>
>> (def num-graph
>>   (graph
>>      num ~(or ~succ ~zero)
>>      succ (succ ^x ~num)
>>      zero zero))
>>
>> ... attach actions ....
>>
>> (def num-out
>>   (output-in num-graph
>>      'zero (fnk [] 0)
>>      'succ (fnk [x] (inc x))))
>>
>> ... and compile the result ...
>>
>> strucjure.regression.tests> (graph->view 'num num-out)
>> (clojure.core/letfn
>>  [(num ...)
>>   (succ ...)
>>   (zero ...)]
>>  (clojure.core/fn
>>   [input__2288__auto__]
>>     (num input__2288__auto__)))
>>
>> This works fine as long as the fnks dont close over anything, but
>> that's very limiting.
>>
>> If I eval that code and *then* wrap it in (binding ...) I can have
>> closures but that now means that I can't do call-site compilation.
>> I'll have to poke around a bit more...
>>
>> On 28 August 2013 18:32, Aaron Cohen <aa...@assonance.org> wrote:
>> > I'm not sure if you'll consider this hacky or not.
>> >
>> >  (def ^:dynamic *fn-helper*)
>> >
>> > (defn eval-at-one [f] (binding [*fn-helper* f] (eval '(*fn-helper* 1))))
>> >
>> >
>> > On Wed, Aug 28, 2013 at 1:28 PM, Jamie Brandon
>> > <ja...@scattered-thoughts.net> wrote:
>> >>
>> >> You will also run into problems if your functions close over any data:
>> >>
>> >> user> (let [f (fn [] 1)] (eval `(~f)))
>> >> 1
>> >> nil
>> >> user> (let [x 1 f (fn [] x)] (eval `(~f)))
>> >> IllegalArgumentException No matching ctor found for class
>> >> user$eval38616$f__38617  clojure.lang.Reflector.invokeConstructor
>> >> (Reflector.java:163)
>> >>
>> >> I'm struggling with this as well, I'm definitely interested in finding
>> >> a non-hacky way to pass closures through eval without leaking memory.
>> >>
>> >> Perhaps something like:
>> >>
>> >> (let [x 1
>> >>        f (fn [] x)
>> >>        f-sym (gensym)]
>> >>   (intern *ns* gensym (weak-ref f))
>> >>   (with-meta (eval `(fn [] (do-stuff-with @~f))) {::strong-ref f}))
>> >>
>> >> So that way f will be freed up when the resulting fn is gced.
>> >>
>> >> On 28 August 2013 17:59, Ben Wolfson <wolf...@gmail.com> wrote:
>> >> > On Wed, Aug 28, 2013 at 9:27 AM, Jamie Brandon
>> >> > <ja...@scattered-thoughts.net> wrote:
>> >> >>
>> >> >>
>> >> >> If you aren't worried about leaking memory, a possible workaround is
>> >> >> to intern the fn in some namespace and then put the symbol in the
>> >> >> macro output.
>> >> >
>> >> >
>> >> > Hrm, I hope it doesn't come to that---as long as I'm creating the
>> >> > functions
>> >> > with their metadata, I can make things work, because I can add extra
>> >> > information to the with-meta call or do extra things when making the
>> >> > call.
>> >> > What I'd like, though, is for it to be possible to copy the metadata
>> >> > over to
>> >> > a new function by client code, just using the regular (with-meta (fn
>> >> > [blah]
>> >> > blah) (meta old-fn)) mechanism. But then the sneaky symbol, or
>> whatever
>> >> > extra thing, in the metadata, that's used in the form to be eval-ed
>> is
>> >> > pointing to the original function, not the one passed in. Maybe just
>> >> > providing a utility for fixing up the metadata is the right move,
>> though
>> >> > it's kidn of dissatisfying.
>> >> >
>> >> >
>> >> > --
>> >> > Ben Wolfson
>> >> > "Human kind has used its intelligence to vary the flavour of drinks,
>> >> > which
>> >> > may be sweet, aromatic, fermented or spirit-based. ... Family and
>> social
>> >> > life also offer numerous other occasions to consume drinks for
>> >> > pleasure."
>> >> > [Larousse, "Drink" entry]
>> >> >
>> >> > --
>> >> > --
>> >> > 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
>> >> > ---
>> >> > 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 clojure+unsubscr...@googlegroups.com.
>> >> > For more options, visit https://groups.google.com/groups/opt_out.
>> >>
>> >> --
>> >> --
>> >> 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
>> >> ---
>> >> 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 clojure+unsubscr...@googlegroups.com.
>> >> For more options, visit https://groups.google.com/groups/opt_out.
>> >
>> >
>> > --
>> > --
>> > 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
>> > ---
>> > 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 clojure+unsubscr...@googlegroups.com.
>> > For more options, visit https://groups.google.com/groups/opt_out.
>>
>> --
>> --
>> 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
>> ---
>> 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 clojure+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>
>

-- 
-- 
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
--- 
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 clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to