On the whole macro debate, whatever one thinks the default behavior should be with respect to variable capture, the syntax-case macro system in scheme works on a representation of program code which is at a higher resolution than what lisp macros works on.<p>The macro can find out for instance, if an identifier used in its input is a free-variable, or if two identifiers share the same binding.
Hence, it is possible to write a relatively short program to define defmacro in terms of define-syntax & syntax-case, but not the other way round. (a pretty short implementation & most of it is error checking - <a href="http://svn.plt-scheme.org/plt/trunk/collects/mzlib/defmacro.ss" rel="nofollow">http://svn.plt-scheme.org/plt/trunk/collects/mzlib/defmacro....</a>)<p>This also strikes me as a inconsistency in arc(albeit easily correctable), as it goes against the rule of not imposing restrictions on the user, by default. Even, if the default macro interface is something simple, the user should be able to write macros which work with syntax at a higher resolution if needed.<p>Also, if you use the most popular distribution, PLT scheme, you have all of reader macros, native hash tables, keyword arguments, a package repository. There is a really nice module system, along with other neat stuff like contracts, lazy modules, frp & of course the continuation based web-server. For OOP, there is Swindle, an analog of CLOS(not having used it, i don't know if it's just as good).<p>After R6Rs, there is a common module system and standard libraries for hash-tables even in the scheme spec.<p>The main flaw, it seems, is the relative lack of libraries as compared to other mainstream languages.
In particular, what i miss is something like wxPython for scheme.<p>EDIT : turns out i spoke too soon, defmacro does have an environment object(<a href="http://www.lispworks.com/documentation/HyperSpec/Body/03_aad.htm" rel="nofollow">http://www.lispworks.com/documentation/HyperSpec/Body/03_aad...</a>) as a parameter, so it has some access to lexical info of its input form. To implement define-syntax, one would also need some way to output a syntax object and not just a s-expr. Couldn't find any defmacro implementation of define-syntax on the net.