I've been working on the Wiki lately and I'm stuck on the part about
syntax-quotes (that I had already written) which required some
updating.
There have been some changes (linked to fully lazy sequences I
suppose) with the way syntax-quotes are expanded.
It used to work like this:
------------------------------
For Lists, syntax-quote establishes a template of the corresponding
data structure. Within the template, unqualified forms behave as if
recursively syntax-quoted.
`(x1 x2 x3 ... xn)
is interpreted to mean
(clojure.core/concat |x1| |x2| |x3| ... |xn|)
where the | | are used to indicate a transformation of an xj as
follows:
* |form| is interpreted as (clojure.core/list `form), which
contains a syntax-quoted form that must then be further interpreted.
* |~form| is interpreted as (clojure.core/list form).
* |~...@form| is interpreted as form.
If the syntax-quote syntax is nested, the innermost syntax-quoted form
is expanded first. This means that if several ~ occur in a row, the
leftmost one belongs to the innermost syntax-quote.
------------------------------
but now
`(x1 x2 x3 ... xn)
is interpreted to mean
(clojure.core/seq (clojure.core/concat |x1| |x2| |x3| ... |xn|))
[ Rich PLEASE explain why the change ]
There's nothing shocking about that except for this peculiar behavior:
`()
is expanded to
(clojure.core/list)
instead of (what you would expect following the rule):
(clojure.core/seq (clojure.core/concat))
Of course the latter would produce nil which is WRONG, so this
asymmetry was introduced (which was NOT there in the past because it
would have been: (clojure.core/concat (clojure.core/list)) ).
But that's not the end of it. If you do
`[]
you get:
(clojure.core/apply clojure.core/vector (clojure.core/seq
(clojure.core/concat)))
instead of (what you would expect and is EQUIVALENT):
(clojure.core/vector)
The same for the other analogous data structures.
Now, that does seem a little bizarre.
A simple question (especially for Rich):
why not simply make
`(x1 x2 x3 ... xn)
expand to
(clojure.core/apply clojure.core/list (clojure.core/seq (clojure.core/
concat))) ?
That way the symmetry is restored and the rules are much simpler.
Rock
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---