[racket-dev] Square-bracket-sensitive macros in Scribble sandboxes

From: Neil Toronto (neil.toronto at gmail.com)
Date: Mon Nov 26 16:49:12 EST 2012

On 11/24/2012 05:36 PM, Eli Barzilay wrote:
> I'm probably missing the problem, which wouldn't be surprising since I
> didn't even tried to look up the `array' documentation...

Well, it didn't exist until I pushed it on Saturday night, so looking it 
up wouldn't have done you any good. :D

> But, there are two things that seem relevant:
>
> 1. For just plain vector syntax, you still have quasiquotes do the
>     usual thing, it only happens that #(...)s are implicitly quoted.
> [...]

I... did not know that. Thanks!

> 2. Alternatively, the last paragraph that you wrote above can also be
>     easily translated by just replacing "[" with "#(", so the array
>     macro distinguishes its contents based on that:
>       -> (define-syntax foo
>            (syntax-rules ()
>              [(foo #(x ...)) (list 'array x ...)]
>              [(foo x)        (list 'datum x)]))
>       -> (foo (+ 1 2))
>       '(datum 3)
>       -> (foo #((+ 1 2)))
>       '(array 3)
>     It's obviously a trivially simple example, but if you currently
>     just dispatch on the paren-shape, then using #(...) instead should
>     work just as well, be more robust, and not introduce the
>     shape-dependent feature.
>
> Am I missing something?

Nope. This works really well, so thanks for the fantastical idea. I'm 
keeping it.

I considered having array data implicitly quoted, like in vector syntax. 
With nested data, though, the number of design options grows quickly, 
the rules get complicated, and printing becomes a nightmare.

For example, it's common to have arrays of Indexes, or (Vectorof Index), 
which would have to print like this with implicit quoting:

   (array `#[,'#(0 0) ,'#(0 1)])

Just working out the algorithm to print such a thing made me want to 
curl up and whimper.

Neil ⊥


Posted on the dev mailing list.