Re: livecoding with Quil middleware

2017-03-19 Thread Nikita Beloglazov
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.


ANN: I wrote a beginner datomic tutorial I wanted to share with y'all, constructive feedback welcome

2017-03-19 Thread Fenton Travers
https://www.reddit.com/r/Clojure/comments/5zu1oc/my_datomic_tutorial_feedback_sought/

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


[ANN] irresponsible/codependence 0.1.0 (dependency resolution for apps - a twist on integrant)

2017-03-19 Thread James Laver
Hi all,

The Irresponsible Clojure Guild is pleased to announce codependence 0.1.0 
is now available on clojars.

This library came about because I liked integrant, but I wanted a bit more 
flexibility. It's built upon integrant (which is cool, I ported it to 
clojurescript!) but with a twist.

In ordinary integrant, you might specify an app like this (component 
configs elided for brevity):

```
{:http {}
 :db {}}
```

In codependence you specify them like this:

```
{:http {:co/tag :http/aleph}
 :db {:co/tag :db/utrecht}
```

In the first example, :http and :db are the tags one will register 
behaviour for. in the second, they are :http/aleph and :db/utrecht. 
integrant refs are unmodified

This firstly means that one tag can instantiate multiple components of the 
same type and secondly makes it easier to ship predefined components and 
let a user stitch them together as config

dep coord: [irresponsible/codependence "0.1.0"]
github: https://github.com/irresponsible/codependence

Cheers,
James (and the ICG)

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