<div dir="ltr">Ahhh, so simple! Thanks, Matthew. I'll give it a shot.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 4, 2014 at 1:11 AM, Matthew Flatt <span dir="ltr"><<a href="mailto:mflatt@cs.utah.edu" target="_blank">mflatt@cs.utah.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">At Wed, 4 Jun 2014 00:38:11 -0400, Daniel Brady wrote:<br>
> So I'm playing around with the DrRacket reader, and I'm decided to see if I<br>
> could disallow certain types of literal data. I figured I'd start with<br>
> numbers, and maybe see if I can come up with a tiny numberless language<br>
> like pure lambda calculus.<br>
><br>
> This is a simple module that I came up with:<br>
><br>
> (module numberless racket<br>
>   (provide (rename-out [no-nums #%datum]))<br>
><br>
>   ;; Raises a syntax error when a number literal is encountered.<br>
>   ;; Note that the datum must be quoted to prevent infinite expansion.<br>
>   (define-syntax (no-nums stx)<br>
>     (syntax-case stx ()<br>
>       ((_ . datum) #'(if (number? (quote datum)) (raise-syntax-error 'Sorry<br>
> "number literals disallowed" (quote datum)) (quote datum))))))<br>
><br>
> I don't know if that's the right way to go about it, but it gets most of<br>
> the job done.<br>
<br>
</div>That's the right idea, but I think you want to check for numbers at<br>
expansion time instead of generating code to check at run time, which<br>
means moving the test out of the #' like this:<br>
<div class=""><br>
  (define-syntax (no-nums stx)<br>
    (syntax-case stx ()<br>
      ((_ . datum)<br>
</div>       (if (number? (syntax-e #'datum))<br>
<div class="">           (raise-syntax-error 'Sorry<br>
                               "number literals disallowed"<br>
</div>                               #'datum)<br>
           #'(quote datum)))))<br>
<br>
Some compound values are can be sent to `datum`, such as vectors like<br>
<br>
 #(1 2 3)<br>
<br>
If you want to disallow numbers in things like vectors, you'll need to<br>
traverse `datum` looking for numbers. See the documentation for<br>
`syntax-e` for the description of values that you'd have to traverse.<br>
<div class=""><br>
> But it doesn't catch quoted number literals:<br>
><br>
> > '3<br>
> 3<br>
><br>
> I don't know what part the reader deals with quoted values.<br>
<br>
</div>The reader turns<br>
<br>
  '3<br>
<br>
into<br>
<br>
 (quote 3)<br>
<br>
So, you don't want to change the reader, but instead define a new<br>
`quote` macro that expands to `no-nums`:<br>
<br>
  (provide (rename-out [no-nums-quote quote]))<br>
<br>
  (define-syntax-rule (no-nums-quote v)<br>
    (no-nums . v))<br>
<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr"><i><font face="garamond, serif">SEE YOU SPACE COWBOY...</font></i></div>
</div>