regexp-match + REPL leads to confusing output

19 views
Skip to first unread message

Sage Gerard

unread,
Oct 16, 2019, 5:25:46 PM10/16/19
to users\@racket-lang.org
I'd like to understand the reader better, and this seems relevant to it. In this REPL session I do not escape \S with a second \ in the first interaction. After I introduce the slash later, the REPL never really "recovers." Even a simple (displayln) stops producing output.

What's happening?

Welcome to Racket v7.4.
> (regexp-match #rx"typedef (\S+)" "typedef void ()")
; readline-input:1:14: read-syntax: unknown escape sequence `\S` in string [,bt
;   for context]
#<procedure:+>
; readline-input:1:30: read-syntax: unexpected `)` [,bt for context]
" "
; typedef: undefined;
;  cannot reference an identifier before its definition
;   in module: top-level
; [,bt for context]
#<procedure:void>
; readline-input:1:47: #%app: missing procedure expression;
;  probably originally (), which is an illegal empty application
;   in: (#%app)
; [,bt for context]
> (regexp-match #rx"typedef (\\S+)" "typedef void ()")
")\n(regexp-match #rx"
; typedef: undefined;
;  cannot reference an identifier before its definition
;   in module: top-level
; [,bt for context]
; |\S+|: undefined;
;  cannot reference an identifier before its definition
;   in module: top-level
; [,bt for context]
" "


~slg


Matthew Flatt

unread,
Oct 16, 2019, 7:20:28 PM10/16/19
to Sage Gerard, users\@racket-lang.org
At Wed, 16 Oct 2019 21:25:35 +0000, Sage Gerard wrote:
> I'd like to understand the reader better, and this seems relevant to
> it. In this REPL session I do not escape \S with a second \ in the
> first interaction. After I introduce the slash later, the REPL never
> really "recovers." Even a simple (displayln) stops producing output.
>
> What's happening?

You're stuck inside a string.

The reader sees

(regexp-match #rx"typedef (\S

and then complains. After complaining, it goes back to reading
expressions. At that point, the input stream still has the unconsumed
characters. Specifically, the next characters are

+)

so, `+` is read successfully and evaluated, and the result prints
#<procedure:+>. Reading again encounters the closing parenthesis by
itself, so that's the next error. But the input stream still has
more...

" "

Those three characters read ok, and the value prints as " ". The input
stream continues

typedef void ()

and so on. Your transcript ends with a double quote that is not yet
closed.


DrRacket's interaction area takes a different (and less confusing)
approach than command-line Racket. As soon as there's any kind of error
from reading and evaluating text submitted at a prompt, DrRacket (not
the reader) discards the input stream and starts a fresh stream with
the new prompt.

But as far as the reader goes, the relevant property is that it stops
consuming characters from a stream when it encounters an error.

Reply all
Reply to author
Forward
0 new messages