Note that you're not converting Scheme '() terminated lists to Arc nil terminated lists. This often isn't noticeable since Arc largely treats '() as a synonym for nil, but it does have an effect in some cases, such as keys in a table:
arc> (= a (table))
arc> (= k (fromstring "[1,2]" (json-read (stdin))))
arc> (= (a k) 'foo)
arc> (a k)
arc> (a '(1 2))
Here k is (1 2 . ()) while '(1 2) is (1 2 . nil), so they're actually different keys in the table.
Whether you feel the need to fix this depends on your application... I ran into a similar issue myself in another project when I was using lists as keys in a table, but it might not affect you for what you're doing.
Arc does treat Scheme's '() as a synonym for nil quite a bit, so there's only a few odd corner cases where the use of '() becomes visible.
Not sure what you mean by getting the reader to recognize #t, #f, #<void>?
For fun I once hacked ac.scm so that Arc's nil was represented internally by Scheme's '(). Inside of Arc everything was still the same: nil was still a symbol and so on. It even seemed to work, though I didn't test it very much.
Most interesting, thanks for these ideas and tips.
The original scheme version converted true to #t, false to #f, and null to (void) which turns into the #<void> literal. These break in arc because #f isn't nil, and #<void> can't even be read by the reader. So I think I have to take a comprehensive look at mzscheme's syntax at some point and make sure that anything scheme code can emit can be read and understood by the arc compiler.