This is the mail archive of the guile@cygnus.com mailing list for the guile project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Second, I don't understand the usage of `$' in regular expressions | here. Or, rather, I think I understand it, but I don't like it. The | manual implies that $ will match newlines. In reality it matches the | end of any string -- rendering it useless for my purposes. The | appended program demonstrates the problem: the regex is matched | individually for each character of /etc/passwd. This behavior | suprised me; I think it would be more natural if a `$' in an expect | regex matched only a newline. (In this case it might be possible for | expect-strings to automatically notice when line-by-line mode could be | entered. (But an explicit flag is good enough for me.)) | | Tom | | (use-modules (ice-9 expect)) | (with-input-from-file "/etc/passwd" | (lambda () | (while (char-ready?) | (expect-strings | ("^.*$" | => (lambda all | (display all) | (newline))))))) I think this fixes the problem. It makes an incompatible change to the underlying "expect" macro: the match procedures take an extra argument which gets the next char peeked from the stream. --- /home/ghouston/guile-core-nonstdio1/ice-9/expect.scm Tue Oct 20 18:09:20 1998 +++ ./expect.scm Mon Mar 15 20:37:33 1999 @@ -37,6 +37,7 @@ (defmacro-public expect clauses (let ((s (gentemp)) (c (gentemp)) + (nc (gentemp)) (port (gentemp)) (timeout (gentemp))) `(let ((,s "") @@ -57,7 +58,8 @@ (if expect-timeout-proc (expect-timeout-proc ,s) #f) - (let ((,c (read-char ,port))) + (let ((,c (read-char ,port)) + (,nc (peek-char ,port))) (if expect-char-proc (expect-char-proc ,c)) (cond ((eof-object? ,c) @@ -78,7 +80,7 @@ (cdr tests) (cdr exprs) (cons - `((,(car tests) ,s) + `((,(car tests) ,s ,nc) ,@(cond ((null? (car exprs)) '()) ((eq? (caar exprs) '=>) @@ -90,7 +92,7 @@ (list (car exprs)) #f) `((apply ,(cadar exprs) - (,(car tests) ,s))))) + (,(car tests) ,s ,nc))))) (else (car exprs)))) body))))) @@ -112,8 +114,10 @@ (cons `(,rxname (make-regexp ,(car tests) regexp/newline)) defs) - (cons `((lambda (s) - (expect-regexec ,rxname s)) + (cons `((lambda (s next-char) + (expect-regexec + ,rxname s + (eof-object? next-char))) ,@(car exprs)) body)))))))) @@ -130,8 +134,8 @@ relative)))))) ;;; convert a match object to a list of strings, for the => syntax. -(define-public (expect-regexec rx s) - (let ((match (regexp-exec rx s))) +(define-public (expect-regexec rx s eof-next?) + (let ((match (regexp-exec rx s 0 (if eof-next? 0 regexp/noteol)))) (if match (do ((i (- (match:count match) 1) (- i 1)) (result '() (cons (match:substring match i) result)))