Rich,

My apologies that what I have said about nil punning came across
as criticism directed at you. That was not intentional. I have
the highest respect for your design work. You're doing an amazing
job and I continue to learn from you.

I understand the lazy vs empty issue and I think you made a good
tradeoff. I'm just bemoaning the fact that nil-punning is really 
vital in keeping data-type issues out of my lisp life and that 
won't work in Clojure.

Ultimately this is cured by deep learning of the language semantics.
I still have a way to go. 

Tim Daly
Literate Software

On Fri, 2011-10-21 at 17:03 -0400, Rich Hickey wrote:
> This message is not specifically in reply to Tim, but to the thread in 
> general.
> 
> It can be very difficult to enumerate (or even remember :) all of the 
> contending tradeoffs around something like Clojure's nil handling.
> 
> The is no doubt nil punning is a form of complecting. But you don't 
> completely remove all issues merely by using empty collections and empty?, 
> you need something like Maybe and then things get really gross (IMO, for a 
> concise dynamic language). 
> 
> I like nil punning, and find it to be a great source of generalization and 
> reduction of edge cases overall, while admitting the introduction of edges in 
> specific cases. I am with Tim in preferring CL's approach over Scheme's, and 
> will admit to personal bias and a certain comfort level with its (albeit 
> small) complexity. 
> 
> However, it couldn't be retained everywhere. In particular, two things 
> conspire against it. One is laziness. You can't actually return nil on rest 
> without forcing ahead. Clojure old timers will remember when this was 
> different and the problems it caused. I disagree with Mark that this is 
> remains significantly complected, nil is not an empty collection, nil is 
> nothing.
> 
> Second, unlike in CL where the only 'type' of empty collection is nil and 
> cons is not polymorphic, in Clojure conj *is* polymorphic and there can only 
> be one data type created for (conj nil ...), thus we have [], {}, and empty?. 
> Were data structures to collapse to nil on emptying, they could not be 
> refilled and retain type.
> 
> At this point, this discussion is academic as nothing could possibly change 
> in this area.
> 
> The easiest way to think about is is that nil means nothing, and an empty 
> collection is not nothing. The sequence functions are functions of collection 
> to (possibly lazy) collection, and seq/next is forcing out of laziness. No 
> one is stopping you from using rest and empty?, nor your friend from using 
> next and conditionals. Peace!
> 
> Rich
> 
> On Oct 21, 2011, at 4:25 PM, daly wrote:
> 
> > On Fri, 2011-10-21 at 15:41 -0400, David Nolen wrote:
> >> Just because we have dynamic types does not give us the freedom to not
> >> consider them.
> > 
> > If all of these dynamics types and all of the tests "respected nil"
> > in its many meanings then 
> >  (when s ..., 
> >  (when (seq s)...,
> >  (when (empty? s)...,
> > would not be an issue. (when s...) would "just work".
> > 
> >> 
> >> 
> >> Clearly express a consideration about the types at play.
> > 
> > Clojure was supposed to transparently substitute things like sequences
> > and vectors everywhere that lisp used lists. That would be true if nil
> > was respected but is not true now and this complicates the code without
> > apparent benefit, in my opinion.
> > 
> > In lisp you can ask what the type is (e.g. by calling consp, vectorp,
> > etc) but these type-specific predicates are relatively rarely used.
> > In fact, when they are used then you are struggling with data-level
> > issue that could probably be abstracted away (e.g. a code smell).
> > 
> > Clojure is a great language but the nil handling is, in my opinion,
> > a design flaw. It forces the introduction of (empty?...) and an
> > awareness of the data types into view unnecessarily.
> > 
> > Tim Daly
> > Literate Software
> > 
> > 
> > 
> > 
> > -- 
> > 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 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

Reply via email to