Thanks -- interesting, especially the bit about the design notes on a
compiler rewrite.

On Thu, Apr 21, 2011 at 22:23, Kevin Downey <redc...@gmail.com> wrote:

> the current compiler doesn't namespace qualify special forms (forms
> which are built into the compiler) but somethings that the
> documentation lists as "special forms" are infact macros defined in
> clojure.core based on the real special forms provided by the compiler.
> macros are namespace qualified so unless you use the fully qualified
> name(clojure.core/let) or :use/use them then they aren't available.
> this difference is kind of unfortunate, and the design notes on a
> compiler rewrite mention changing things so the forms directly
> supported by the compiler are also namespace qualified and live in
> clojure.core
>
> On Thu, Apr 21, 2011 at 12:24 PM, Simon Katz <nomisk...@gmail.com> wrote:
> > Hi.
> >
> > (In case it makes a difference, I'm using Clojure 1.2.)
> >
> > If one creates a new namespace using in-ns, the new namespace
> > does not refer to clojure.core, as explained at
> > http://clojure.org/namespaces.
> >
> > I noticed one can use certain special forms in a namespace
> > created using in-ns, but not others:
> >  _________________________________________
> > |
> > | user> (in-ns 'my-new-ns)
> > | #<Namespace my-new-ns>
> > |
> > | my-new-ns> (quote a)
> > | a
> > |
> > | my-new-ns> (def x 42)
> > | #'my-new-ns/x
> > |
> > | my-new-ns> (let [a 42] a)
> > | ;; Evaluation aborted. Unable to resolve symbol: let in this context
> > |
> > | my-new-ns> (fn [] 42)
> > | ;; Evaluation aborted. Unable to resolve symbol: fn in this context
> > |_________________________________________
> >
> > That puzzled me.
> >
> > In the process of trying to understand, I came across a mention
> > of clojure.lang.Compiler/specials (a map with symbols as its keys)
> > at
> http://stackoverflow.com/questions/3159836/is-there-a-way-to-get-a-collection-of-clojure-special-forms-programatically
> >  _________________________________________
> > |
> > | user> (keys clojure.lang.Compiler/specials)
> > | ;; => (deftype* new quote & var set! monitor-enter recur .
> > |        case* clojure.core/import* reify* do fn* throw
> > |        monitor-exit letfn* finally let* loop* try catch if
> > |        def)
> > |_________________________________________
> >
> > So it seems that there are two kinds of special symbol.  I'll
> > refer to them as implementation specials and documented specials:
> >  - implementation specials
> >    those that are keys in the clojure.lang.Compiler/specials
> >    map
> >  - documented specials
> >    those that are documented as being special at
> >    http://clojure.org/special_forms.
> > (Note that some symbols are of both kinds.)
> >
> > I assume that documented specials that are not implementation
> > specials are implemented as macros. (And the post I mentioned
> > above at stackoverflow.com says so.)
> >
> > Here's some investigation of these two kinds of special symbol:
> >  _________________________________________
> > |
> > | user> (def implementation-specials
> > |            (keys clojure.lang.Compiler/specials))
> > | #'user/implementation-specials
> > |
> > | user> (def documented-specials
> > |            '(def if do let quote var fn loop recur throw try
> > |              monitor-enter monitor-exit . new set!))
> > | #'user/documented-specials
> > |
> > | user> (defn symbol-info [symbol]
> > |         [(special-symbol? symbol)
> > |          (= (resolve symbol) nil)
> > |          symbol])
> > | #'user/symbol-info
> > |
> > | user> (pprint (map symbol-info implementation-specials))
> > | ([true true deftype*]
> > |  [true true new]
> > |  [true true quote]
> > |  [true true &]
> > |  [true true var]
> > |  [true true set!]
> > |  [true true monitor-enter]
> > |  [true true recur]
> > |  [true true .]
> > |  [true true case*]
> > |  [true true clojure.core/import*]
> > |  [true true reify*]
> > |  [true true do]
> > |  [true true fn*]
> > |  [true true throw]
> > |  [true true monitor-exit]
> > |  [true true letfn*]
> > |  [true true finally]
> > |  [true true let*]
> > |  [true true loop*]
> > |  [true true try]
> > |  [true true catch]
> > |  [true true if]
> > |  [true true def])
> > | nil
> > |
> > | user> (pprint (map symbol-info documented-specials))
> > | ([true true def]
> > |  [true true if]
> > |  [true true do]
> > |  [false false let]
> > |  [true true quote]
> > |  [true true var]
> > |  [false false fn]
> > |  [false false loop]
> > |  [true true recur]
> > |  [true true throw]
> > |  [true true try]
> > |  [true true monitor-enter]
> > |  [true true monitor-exit]
> > |  [true true .]
> > |  [true true new]
> > |  [true true set!])
> > | nil
> > |_________________________________________
> >
> > There are a few interesting things here:
> >
> >  - special-symbol? returns true for implementation specials
> >    (actually not surprising when you look at the implementation
> >    of special-symbol?, but perhaps surprising if you have only
> >    read http://clojure.org/namespaces and the documentation of
> >    special-symbol? which says "Returns true if [the argument]
> >    names a special form").
> >
> >  - Calling resolve on an implementation special gives nil.
> >
> >  - In a namespace created using in-ns (such as my-new-ns above)
> >    one is able to make use of implementation specials.
> >    Implementation specials seem to bypass the normal
> >    resolution process:
> >    - defn is not an implementation special:
> >        user> (resolve 'defn)
> >        #'clojure.core/defn
> >    - def is an implementation special:
> >        user> (resolve 'def)
> >        nil
> >
> > Well, that's probably enough wittering.
> >
> > Any comments?
> >
> > And my main question...
> > Is any of this stuff documented? (Perhaps there's other related
> > stuff that it would be good to know.)
> >
> > Simon
> >
> > --
> > 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
>
>
>
> --
> And what is good, Phaedrus,
> And what is not good—
> Need we ask anyone to tell us these things?
>
> --
> 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