On Thu, Jun 23, 2011 at 11:55 AM, B Smith-Mannschott
<bsmith.o...@gmail.com> wrote:
> user> (name 'a/b/c)
> "c"
> user> (namespace 'a/b/c)
> "a/b"
>
> Is this intentional? I would have expected a/b/c to be
> rejected as a symbol name since we use slashes to separate
> namespace from name and conventionally use "." to indicate
> hierarchy in namespace names.

=> (namespace (symbol "" "a/b"))
""
=> (name (symbol "" "a/b"))
"a/b"

Both the namespace and the name can contain slashes, but the normal
reader behavior is that foo/bar/baz is interpreted as namespace up to
the last slash and then name. Unless the symbol is just "/", in which
case the reader treats that as the name, with no namespace. (Necessary
for a bare / to resolve, ordinarily, to the division function
clojure.core//). You can get any desired symbol using the two-argument
form of the symbol function, though.

There's some ickiness here. For instance the one-argument form of
symbol doesn't parse the same as the reader does:

=> (clojure.core// 42 2)
21
=> (eval (list (symbol "clojure.core//") 42 2))
#<CompilerException java.lang.StringIndexOutOfBoundsException: String
index out of range: 0 (NO_SOURCE_FILE:1)>
=> (eval (list (symbol "clojure.core" "/") 42 2))
21

In fact, (symbol "clojure.core//") produces a symbol with namespace
"clojure.core/" and name "", the latter of which apparently leads to
the rather obfuscatory error message above.

Symbols whose names contain slashes don't work as vars -- another
cryptic message, since the symbol's actually unqualified here:

=> (eval (list 'def (symbol "" "foo/bar") 42))
#<CompilerException java.lang.Exception: Can't refer to qualified var
that doesn't exist (NO_SOURCE_FILE:1)>

And symbols whose namespaces contain slashes won't work as vars with
AOT, if at all, since the namespace name ends up a class file name and
slashes are path separator characters on every sane filesystem and
thus cannot appear in file names.

Moral of the story: try to avoid slashes in symbol names, except for
the unqualified name of the division operator. :) But if you really
for some reason need one it can be done, though the only apparent use
for such a symbol is as a kind of auto-interning string rather than as
a var name. You'd probably be better off using a keyword for such
uses.

-- 
Protege: What is this seething mass of parentheses?!
Master: Your father's Lisp REPL. This is the language of a true
hacker. Not as clumsy or random as C++; a language for a more
civilized age.

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