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.com>wrote:

> 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 27, 2013 at 9:15 AM, Brandon Bloom 
> <brandon.d.bl...@gmail.com>wrote:
>
>> > 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 useful, then you have no choice but to do something like
>> if-recv or explicitly test against nil.
>>
>> > It's these Rx style programming methods that make people think they
>> need this feature.
>>
>> I built my little Rx with channels library (asyncx) without intention to
>> use it directly, but because I wanted to learn how to work with channels. I
>> rapidly learned that the techniques are a lot more different than they
>> look. In particular, it's more difficult to write channel & process
>> combinators precisely because they are more powerful. However, in
>> practice, each new reusable channel/process combinator yields more
>> complexity than it tends to save. I'd rather intentionally choose strictly
>> less powerful primitives where appropriate and enforce that with
>> encapsulation.
>>
>> With that in mind, if I ever revisit asyncx, I'll probably define "push
>> sequences" or "streams" in terms of protocols and deftypes. I'd use
>> core.async to implement them, but only for the lowest level primitives. I'd
>> provide ways to get in to or out of the stream subsystem for interop with
>> channels, but the public interface would take IStream objects.
>>
>>
>> On Tue, Aug 27, 2013 at 10:58 AM, Timothy Baldridge <tbaldri...@gmail.com
>> > wrote:
>>
>>> 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 as such and I doubt you'll
>>> ever have a need for nils in a channel.
>>>
>>> If we treat channels as ways of co-ordinating concurrent processes, then
>>> nil doesn't have a use case. 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".
>>>
>>> It's these Rx style programming methods that make people think they need
>>> this feature.
>>>
>>> Timothy
>>>
>>>
>>>
>>>
>>> On Tue, Aug 27, 2013 at 8: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 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:
>>>>>
>>>>>
>>>> Agreed that you want a single sentinel value.
>>>>
>>>> It doesn't match lazy-seqs at all though: lazy seqs can contain nils
>>>> just fine. There's a big difference between (next some-lazy-seq) [which
>>>> could be nil, indicating an empty sequence] and the actual values in the
>>>> seq [which could also be nil but don't indicate the end of the seq].
>>>>
>>>>
>>>>> (when-let [v (<! c)]
>>>>>   (process v))
>>>>>
>>>>> If we chose a different value, this becomes much more ugly:
>>>>>
>>>>> (let [v (<! c)]
>>>>>   (when-not (= v :async/closed)
>>>>>     (process v)))
>>>>>
>>>>>
>>>> This can be solved easily by providing a macro or some other predicate
>>>> that knows how to check for the sentinel value correctly. e.g.
>>>>
>>>> (when-more [v (<! c)]
>>>>   (process v))
>>>>
>>>>
>>>>> b) I question if there are any valid uses for putting nil in a
>>>>> channel. With all due respect to all who have written here, thus far, 
>>>>> every
>>>>> complaint about nils and channels boils down to a conversion from seqs to
>>>>> channels. This is the wrong way to look at the problem. Channels are
>>>>> co-ordination primitives not data structures. Simply because a lazy seq
>>>>> looks like a channel, doesn't mean that they should be treated as such.
>>>>>
>>>>>
>>>>> In all the core.async code I've written I've never had to put a nil in
>>>>> a channel, so I'm left with the uncomfortable conclusion that most
>>>>> complaints on this subject are contrived. I could be wrong, but I just
>>>>> haven't seen a valid use case yet.
>>>>>
>>>>>
>>>> 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 channel?
>>>>
>>>> Two use cases I have encountered that motivate this:
>>>>
>>>> a) what if you want to send a sequence through a channel? Since nil as
>>>> a value represents the empty sequence, you have to put in some extra
>>>> special case handling with the current core.async model.
>>>>
>>>> b) what if you want to write generic code to send all the values in an
>>>> arbitrary collection through a channel? you would have to wrap/unwrap nils
>>>> at either end to make this work currently.
>>>>
>>>> Both of these, I think, are reasonable and common enough use cases that
>>>> it's worth supporting them elegantly rather than forcing users to implement
>>>> their own nil-wrapping functionality.
>>>>
>>>>
>>>>> This all being said, there really isn't a technical reason to not
>>>>> allow nils, it just simplifies much of the design and that probably
>>>>> translates to better performance. So the restriction could be lifted if a
>>>>> rock solid reason could be found, but as of yet, I haven't seen it.
>>>>>
>>>>
>>>> I don't believe there is any noticeable performance difference between
>>>> checking for nil and checking if a value is identical? to some sentinel
>>>> value (which would presumably be static, final, immutable and hence very
>>>> well optimised by the JVM). In addition, not allowing nils just means you
>>>> have to do extra work to wrap/unwrap nils as a user - which is almost
>>>> certainly a net loss on overall performance.
>>>>
>>>> Still, I think consistency is more significant than the performance
>>>> argument in this case.
>>>>
>>>>
>>>>>
>>>>> Timothy Baldridge
>>>>>
>>>>>
>>>>> On Tue, Aug 27, 2013 at 2:12 AM, Max Penet <m...@qbits.cc> wrote:
>>>>>
>>>>>> 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, 2013 4:44:48 AM UTC+2, Mikera wrote:
>>>>>>>
>>>>>>> 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 big design flaw given the ubiquity of
>>>>>>> sequences in Clojure code - it appears to imply that you can't easily
>>>>>>> compose channels with generic sequence-handling code without some pretty
>>>>>>> ugly special-case handling.
>>>>>>>
>>>>>>> Am I missing something? Is this a real problem for others too?
>>>>>>>
>>>>>>> If it is a design flaw, can it be fixed before the API gets locked
>>>>>>> down?
>>>>>>>
>>>>>>  --
>>>>>> --
>>>>>> 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.
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> “One of the main causes of the fall of the Roman Empire was
>>>>> that–lacking zero–they had no way to indicate successful termination of
>>>>> their C programs.”
>>>>> (Robert Firth)
>>>>>
>>>>> --
>>>>> --
>>>>> 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 a topic in the
>>>>> Google Groups "Clojure" group.
>>>>> To unsubscribe from this topic, visit
>>>>> https://groups.google.com/d/topic/clojure/pF9FEP7b77U/unsubscribe.
>>>>> To unsubscribe from this group and all its topics, 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.
>>>>
>>>
>>>
>>>
>>> --
>>> “One of the main causes of the fall of the Roman Empire was that–lacking
>>> zero–they had no way to indicate successful termination of their C
>>> programs.”
>>> (Robert Firth)
>>>
>>> --
>>> --
>>> 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 a topic in the
>>> Google Groups "Clojure" group.
>>> To unsubscribe from this topic, visit
>>> https://groups.google.com/d/topic/clojure/pF9FEP7b77U/unsubscribe.
>>> To unsubscribe from this group and all its topics, 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.
>>
>
>
>
> --
> “One of the main causes of the fall of the Roman Empire was that–lacking
> zero–they had no way to indicate successful termination of their C
> programs.”
> (Robert Firth)
>
> --
> --
> 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 a topic in the
> Google Groups "Clojure" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/clojure/pF9FEP7b77U/unsubscribe.
> To unsubscribe from this group and all its topics, 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