1) I agree this seems silly but I don't think it's ever bitten me

2) I think this has caused me problems once or twice

3) It would be nice to have Named and Namespaced, but I don't think
it's feasible to make the change now - there's too much code assuming
you can get the namespace of a Named thing. Maybe it would be okay if
we left Named alone, added Namespaced, and then had (namespace foo)
first check for Namespaced and then for Named.

4) Yes please this drives me crazy. Every time I do the following I
cringe:
(letfn [(symbol [& args] (apply clojure.core/symbol (map name args)))]
  (...use a sane-seeming symbol function...))

On Dec 1, 10:00 am, joegallo <joega...@gmail.com> wrote:
> Here are some things I've run across in Clojure that seem asymmetric to me
> -- I looked through Jira for issues related to these, but I didn't find any
> (of course, I might have just missed them).  Some of these might be valid
> enhancements that would make sense to add, some of them might be a case of
> me having a bad mental model and wanting the wrong thing from the
> language.  I'm hoping to get some feedback to help me determine which is
> which, and then I'll write some patches for the ideas that are good ones.
> I've tried to avoid making any statements about the world (e.g. x is y),
> these are all just statements about my personal experience (e.g. x seems
> like y to me).
>
> 1.
> user=> (keyword 'foo)
> :foo
> user=> (keyword "foo")
> :foo
> user=> (keyword :foo)
> :foo
> user=> (symbol "foo")
> foo
> user=> (symbol 'foo)
> foo
> user=> (symbol :foo)
> ClassCastException clojure.lang.Keyword cannot be cast to java.lang.String
> clojure.core/symbol (core.clj:522)
>
> I've never wanted to create a symbol from a keyword, but this seems
> asymmetrical to me.
>
> 2.
> user=> (name 'user)
> "user"
> user=> (name :user)
> "user"
> user=> (name "user")
> "user"
> user=> (name *ns*)
> ClassCastException clojure.lang.Namespace cannot be cast to
> clojure.lang.Named  clojure.core/name
> (core.clj:1488)
>
> I think of namespaces as being a thing that has a name, so I would expect
> to be able to call name on them.  I always do this first, and then it blows
> up, and then I remember ns-name, but that returns a symbol, not a string
> (which I also always forget), so then I finally have to pipe that through
> name or str, which ends up seeming messier than it should to me.
>
> user=> (name (ns-name *ns*))
> "user"
>
> One solution to that would be name namespaces a clojure.lang.Named, where
> they return their own name -- which seems reasonable to me.  But that would
> lead us to this next case, below.
>
> 3.
> user=> (namespace 'foo)
> nil
> user=> (namespace 'user/foo)
> "user"
> user=> (namespace :foo)
> nil
> user=> (namespace ::foo)
> "user"
> user=> (namespace *ns*)
> ClassCastException clojure.lang.Namespace cannot be cast to
> clojure.lang.Named  clojure.core/namespace (core.clj:1496)
>
> If we make Namespaces a clojure.lang.Named, then they'll also need to have
> an implementation of getNamespace.  I suppose we could return the
> namespace's name, but does that imply that a namespace is in itself?  That
> seems wrong to me.  Another option would be to return nil, which indicates
> that a namespace is not in a namespace, which is true, but possibly
> confusing.  A third possibility would be to split Named into Named (has a
> name) and Namespaced (has a namespace), and then we don't have this issue
> at all -- we'd be free to say that namespaces are Named, but not
> Namespaced.
>
> 4.
> user=> (symbol "bar")
> bar
> user=> (symbol 'bar)
> bar
> user=> (symbol "foo" "bar")
> foo/bar
> user=> (symbol "foo" 'bar)
> ClassCastException clojure.lang.Symbol cannot be cast to java.lang.String
> clojure.core/symbol
> (core.clj:523)
>
> user=> (symbol 'foo 'bar)
> ClassCastException clojure.lang.Symbol cannot be cast to java.lang.String
> clojure.core/symbol
> (core.clj:523)
> user=> (symbol *ns*
> 'bar)
>
> ClassCastException clojure.lang.Namespace cannot be cast to
> java.lang.String  clojure.core/symbol
> (core.clj:523)
> user=> (symbol *ns* "bar")
> ClassCastException clojure.lang.Namespace cannot be cast to
> java.lang.String  clojure.core/symbol
> (core.clj:523)
>
> I always forget that symbol allows a string or a symbol for first argument,
> but that when you have two arguments, they must both be strings.  It's
> another "d'oh!" thing for me that I find myself correcting a lot.  I'd also
> like to be able to construct a symbol with a namespace object directly, not
> just the string that represents the namespace's name.
>
> Anyway, what do you think?  If there are any smart ideas here, I'd be happy
> to create a jira ticket and attach a patch with tests.
>
> Joe

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