thank you very much Nikita
by playing with anonymous functions vs partial applications i got exactly 
the behaviour i was after!
that's awesome :-)
Jay

On Friday, March 24, 2017 at 7:00:41 AM UTC+7, Nikita Beloglazov wrote:
>
> Yes, middleware runs exactly once so you can't redefine it. In the example 
> with fill-background you can redefine fill-backgfound:
>
>  (def fill-background [draw-fn] (draw-fn))
>
> Which essentially makes it identify. So that's would be my recommendation: 
> put all logic to fill-background and let fill-background-middleware be 
> just a wrapper like it is now. 
>
> On Wednesday, March 22, 2017 at 8:22:59 PM UTC-7, Jay Porcasi wrote:
>>
>> hi Nikita
>>
>> thank you so much for your explanation, it's very clear (and a bit 
>> surprising to learn that partial and anonymous functions have a slightly 
>> different semantics)
>>
>> i am able to get the live coding behaviour when i redefine 
>> fill-background (as per your example, and that's great that it is 
>> possible)
>>
>> however it seems not possible to get a live coding behaviour when 
>> redefining fill-background-middleware (the middleware function itself)
>>
>> for example i would love if i could evaluate:
>> (def fill-background-middleware identity)
>> and see the background reverting to what it was before (that's just an 
>> example)
>>
>> but this seems not possible because that middleware runs just once, when 
>> the sketch is initialized
>>
>> do i understand correctly?
>> and is it something that would not be achievable by any other means? (one 
>> more level of indirection perhaps? :-)
>>
>> Jay
>>
>>
>>
>> On Monday, March 20, 2017 at 11:09:35 AM UTC+7, Nikita Beloglazov wrote:
>>>
>>> Hi Jay
>>>
>>> Yes, draw and update functions support live coding out-of-box. It's 
>>> trickier with middleware. The main thing is that middleware run once, when 
>>> initializing sketch. The goal of middleware is to take user provided 
>>> settings (like draw and update funcitons), optionally wrap some of them in 
>>> another functions and return new settings. It depends on your middleware 
>>> implementation whether it supports live coding. As a simple example let's 
>>> say you have a simple middleware that fills background with some color 
>>> before each draw. Here is how you can do it so it supports live reloading:
>>>
>>> (defn fill-background [draw-fn]
>>>   (q/background 255)
>>>   (draw-fn))
>>>
>>> (defn fill-background-middleware [options]
>>>   (let [user-draw (:draw options)]
>>>     (assoc options
>>>       :draw #(fill-background user-draw))))
>>>
>>> (q/defsketch abc
>>>   :draw ...
>>>   :middleware [fill-background-middleware])
>>>
>>> If you try changing 'fill-background', for example change color from 255 
>>> to 200, then you should see effect immediately. The trick is on line 
>>>
>>> :draw #(fill-background user-draw))))
>>>
>>> Here we say that new draw function is an anonymous function that calls 
>>> fill-background. So on each draw invocation it will lookup fill-background 
>>> function by name. If you reload this function - name will stay the same, 
>>> but implementation changes and interpreter pick ups new function. On the 
>>> other hand if you do following:
>>>
>>> :draw (partial fill-background user-draw)
>>>
>>> Then you won't get live reloading. Even though these 2 approaches 
>>> essentially do the same, the second approach actually "remembers" original 
>>> version of fill-background. If you try changing that function it won't have 
>>> effect as interpreter no longer looks up function by name. 
>>>
>>> I'm probably not explaining it very well but I hope it's still helpful. 
>>> If you still have problems with your middleware - feel free to post the 
>>> code in this thread and I'll take a look.
>>>
>>> Nikita
>>>
>>> On Friday, March 17, 2017 at 7:50:02 PM UTC-7, Jay Porcasi wrote:
>>>>
>>>> hello, i hope this is the place to discuss questions about Quil (i 
>>>> couldn't find a dedicated forum)
>>>>
>>>> and first of all, kudos to Nikita for this incredible library, which i 
>>>> find even better than the original Processing
>>>> it's not just a matter of using a different syntax than java, but 
>>>> Nikita actually created something more powerful and flexible than 
>>>> Processing
>>>>
>>>> i'm particularly fond of the middleware functionality, which is a 
>>>> stroke of genius: so simple in retrospect and so powerful, opening a whole 
>>>> new way of possibilities of structuring one's own work in a modular fashion
>>>>
>>>> so i have one question regarding live coding and middleware
>>>>
>>>> if i redefine a function that i associate to :setup, :update or :draw 
>>>> keys, i can see my running sketch changing on the fly, reflecting the new 
>>>> definitions
>>>>
>>>> this is not the case however if i redefine a function that i use as a 
>>>> middleware
>>>>
>>>> is it an intrinsic limitation? would it be possible to extend the live 
>>>> coding behaviour to middlewares as well?
>>>>
>>>> thanks and long live Quil,
>>>> Jay
>>>>
>>>>

-- 
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/d/optout.

Reply via email to