Re: core.async - handling nils

2013-08-27 Thread Max Penet
It's a real problem for me too, I also wonder what was the intention behind this. I guess there could be a very good reason for this special treatement of nils, but I haven't seen it yet. I would love to hear about this from people involved in core.async development. On Friday, August 16,

Re: core.async - handling nils

2013-08-27 Thread Timothy Baldridge
The reason for not allowing nils isn't a complex one, and basically boils down to the following: a) to avoid race conditions, we need a single value to signal the channel is closed. As mentioned, nil is the obvious choice for this as it matches lazy seqs and fits well with the rest of clojure:

Re: core.async - handling nils

2013-08-27 Thread Mike Anderson
On 27 August 2013 20:45, Timothy Baldridge tbaldri...@gmail.com wrote: The reason for not allowing nils isn't a complex one, and basically boils down to the following: a) to avoid race conditions, we need a single value to signal the channel is closed. As mentioned, nil is the obvious choice

Re: core.async - handling nils

2013-08-27 Thread Timothy Baldridge
All your arguments come down to this: I have an arbitrary seq of things I want to send down a channel. It's exactly that concept I that I push against. Everything you've mentioned thus far is a data structure. Channels are not data structures they are concurrency management primitives, treat them

Re: core.async - handling nils

2013-08-27 Thread David Nolen
On Tue, Aug 27, 2013 at 10:51 AM, Mike Anderson mike.r.anderson...@gmail.com wrote: To me it's all about consistency with other Clojure constructs. You can safely put nils in sequences, vectors, lists, sets etc.. nil is a valid value just like anything else. So why can't you put them in a

Re: core.async - handling nils

2013-08-27 Thread Brandon Bloom
In every use of channels I've had thus far, nil is better expressed as an empty collection, false, 0, :tick, or some other ground value. I agree completely. But I'll note that you mention false being useful... If you're writing completely general operators, like map, which are *sometimes* quite

Re: core.async - handling nils

2013-08-27 Thread Timothy Baldridge
Right, the use of false is a special case. I'm thinking of a mouse event stream, may have a button channel that sends true or false based on the state of the mouse button. Even saying that though, I would probably opt for :clicked and :unclicked or somethig of that nature. Timothy On Tue, Aug

Re: core.async - handling nils

2013-08-27 Thread Softaddicts
+1 We built a distributed software sending/receiving *messages* based on different protocols. All our protocols wrap data in an envelope. The receiver can then decide how to handle the message based on the envelope. Obviously, nil makes a bad envelope. A nil message on a channel never had any

Re: core.async - handling nils

2013-08-27 Thread Ben Wolfson
On Tue, Aug 27, 2013 at 7:51 AM, Mike Anderson mike.r.anderson...@gmail.com wrote: On 27 August 2013 20:45, Timothy Baldridge tbaldri...@gmail.com wrote: The reason for not allowing nils isn't a complex one, and basically boils down to the following: a) to avoid race conditions, we need a

Re: core.async - handling nils

2013-08-27 Thread Brandon Bloom
As long as we don't go full Haskell mode: data Message a = Value a | Done On Tue, Aug 27, 2013 at 11:20 AM, Timothy Baldridge tbaldri...@gmail.comwrote: Right, the use of false is a special case. I'm thinking of a mouse event stream, may have a button channel that sends true or false based

Re: core.async - handling nils

2013-08-27 Thread Mike Anderson
I still don't see why you would want to to arbitrarily limit what you can put down a channel. FWIW, plenty of other concurrency management primitives allow nils as values (java.util.concurrent.AtomicReference, Clojure atoms / refs / agents to name but a few). My motivating use case is the ability

Re: core.async - handling nils

2013-08-27 Thread guns
On Wed 28 Aug 2013 at 09:38:06AM +0800, Mike Anderson wrote: Of course, if anyone has an actual technical argument why it is necessary/better to use nil as a sentinel value, I would be delighted to learn of it and would consider myself enlightened. Forgive me if someone already mentioned

Re: core.async - handling nils

2013-08-27 Thread Mikera
Well, that's certainly a good explanation of why core.async works the way it does now - it's a natural and sensible starting point to build on Java Queues. I don't think that this necessarily implies that we have to follow this model in the future Clojure API though. The Java designers didn't

Re: core.async - handling nils

2013-08-27 Thread guns
On Tue 27 Aug 2013 at 07:42:53PM -0700, Mikera wrote: On Wednesday, 28 August 2013 09:54:51 UTC+8, guns wrote: On Wed 28 Aug 2013 at 09:38:06AM +0800, Mike Anderson wrote: Of course, if anyone has an actual technical argument why it is necessary/better to use nil as a sentinel value,

Re: core.async - handling nils

2013-08-27 Thread Alan Busby
On Wed, Aug 28, 2013 at 12:18 PM, guns s...@sungpae.com wrote: Oh, I was confused; I was thinking about sentinel values in user code. Yes, I imagine a single private (Object.) would work just fine, with very little overhead. First, I'd hope that sentinel values would be handled by the

Re: core.async - handling nils

2013-08-27 Thread guns
On Wed 28 Aug 2013 at 12:50:19PM +0900, Alan Busby wrote: On Wed, Aug 28, 2013 at 12:18 PM, guns s...@sungpae.com wrote: Oh, I was confused; I was thinking about sentinel values in user code. Yes, I imagine a single private (Object.) would work just fine, with very little overhead.

Re: core.async - handling nils

2013-08-27 Thread Mike Anderson
On 28 August 2013 11:50, Alan Busby thebu...@gmail.com wrote: On Wed, Aug 28, 2013 at 12:18 PM, guns s...@sungpae.com wrote: Oh, I was confused; I was thinking about sentinel values in user code. Yes, I imagine a single private (Object.) would work just fine, with very little overhead.

Re: core.async - handling nils

2013-08-18 Thread Mikera
If you use a singleton sentinel value that is generated privately within the core.async implementation, then the sentinel isn't really a regular value in the sense that it can be created by regular user code. nil, on the other hand, gets used very frequently as a value in regular Clojure code.

Re: core.async - handling nils

2013-08-17 Thread Mikera
My overall sense is that the convenience of using if-let directly in a few use cases doesn't justify making channels fall short of being able to send arbitrary values (nil specifically, and clearly boolean false can cause some problems too). I think it would be a much better design to have a

Re: core.async - handling nils

2013-08-17 Thread Brandon Bloom
That's precisely the design followed by Magpie, described here: http://journal.stuffwithstuff.com/2013/04/17/well-done/ Parts 1 2 of that series are worth reading too. On Sat, Aug 17, 2013 at 8:48 PM, Mikera mike.r.anderson...@gmail.comwrote: My overall sense is that the convenience of using

Re: core.async - handling nils

2013-08-17 Thread Ben Wolfson
A sentinel value also prevents channels from being able to send/receive arbitrary values, without further wrapping. Sent from my iPhone On Aug 17, 2013, at 5:48 PM, Mikera mike.r.anderson...@gmail.com wrote: My overall sense is that the convenience of using if-let directly in a few use

Re: core.async - handling nils

2013-08-16 Thread Brandon Bloom
I ran into the other half of this problem: If you expect nils to signify closed channels, then you can't leverage the logically false nature of nil without excluding explicit boolean false values. Given the pleasant syntax of if-let / ! pairs, I reworked my early experiments to use if-recv

Re: core.async - handling nils

2013-08-16 Thread Ben Wolfson
On Fri, Aug 16, 2013 at 4:50 PM, Brandon Bloom brandon.d.bl...@gmail.comwrote: I ran into the other half of this problem: If you expect nils to signify closed channels, then you can't leverage the logically false nature of nil without excluding explicit boolean false values. Given the pleasant

Re: core.async - handling nils

2013-08-16 Thread Brandon Bloom
have every other value come wrapped in a Just or Some-like constructor That's what I meant by a pair of quote/unquote operators -- -- 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

Re: core.async - handling nils

2013-08-16 Thread Ben Wolfson
On Fri, Aug 16, 2013 at 5:07 PM, Brandon Bloom brandon.d.bl...@gmail.comwrote: have every other value come wrapped in a Just or Some-like constructor That's what I meant by a pair of quote/unquote operators ah, gotcha -- Ben Wolfson Human kind has used its intelligence to vary the

core.async - handling nils

2013-08-15 Thread Mikera
Hi all, I'm experimenting with core.async. Most of it is exceptionally good, but bit I'm finding it *very* inconvenient that nil can't be sent over channels. In particular, you can't pipe arbitrary Clojure sequences through channels (since sequences can contain nils). I see this as a pretty