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