[plt-scheme] define own escape sequences?

From: Paul Graham (cryptograham at gmail.com)
Date: Tue Jun 16 01:33:34 EDT 2009

Unfortunately this module doesn't seem to exist in v372.

  Welcome to MzScheme v372 [3m], Copyright (c) 2004-2007 PLT Scheme Inc.
  require: unknown module: syntax/readerr

Is there a way to do it in v372?

Thanks!  --pg

On Mon, Jun 15, 2009 at 6:58 PM, Eli Barzilay<eli at barzilay.org> wrote:
> On Jun 15, Eli Barzilay wrote:
>> There is no hook for extending the string syntax, so you'll need a new
>> reader macro for strings.  If you want all of mzscheme's escapes, then
>> the tedious part in this will be all the numeric escapes (octal and
>> hex).  So depending on the problem you're trying to solve, it might be
>> easier to define a new kind of escape, or maybe use something like the
>> scribble syntax (http://docs.plt-scheme.org/scribble/reader.html).
> Actually, another way to hack this would be to just hook on the
> mzscheme reader, after regexp-replacing the contents of the string.
> Here's an example that constructs such a readtable -- with a string it
> uses the mzscheme parser after replacing all `\@' with `\\@'.  If
> you're using v4, it would be very easy to go from this code to a
> reader for a `#lang <foo>' language that has this syntax for strings.
> -------------------------------------------------------------------------------
> #lang scheme
> (require syntax/readerr)
> (define (make-my-readtable rt)
>  (define (parse-string bytes)
>    (parameterize ([current-readtable rt]) ; use the original reader
>      (let ([bytes (regexp-replace*
>                    #rx#"\\\\." bytes
>                    (lambda (m) (if (equal? m #"\\@") #"\\\\@" m)))])
>        (read (open-input-bytes (bytes-append #"\"" bytes #"\""))))))
>  (make-readtable
>   rt #\" 'terminating-macro
>   (lambda (char inp src line col pos)
>     (define bytes
>       (cadr (or (regexp-try-match #rx#"^((?:[^\\]+?|\\\\.)*?)\"" inp)
>                 (raise-read-eof-error "expected a closing '\"'"
>                                       src line col pos #f))))
>     (datum->syntax #f (parse-string bytes)
>                    (list src line col pos (+ 2 (bytes-length bytes)))))))
> (define (my-read . args)
>  (parameterize ([current-readtable (make-my-readtable (current-readtable))])
>    (apply read args)))
> -------------------------------------------------------------------------------
> --
>          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
>                  http://www.barzilay.org/                 Maze is Life!

Posted on the users mailing list.