Node:Expect, Next:The Scheme shell (scsh), Previous:Rx Regexps, Up:Top
The macros in this section are made available with:
(use-modules (ice-9 expect))
expect is a macro for selecting actions based on the output from
a port. The name comes from a tool of similar functionality by Don Libes.
Actions can be taken when a particular string is matched, when a timeout
occurs, or when end-of-file is seen on the port. The expect macro
is described below; expect-strings is a front-end to expect
based on regexec (see the regular expression documentation).
| expect-strings clause ... | Macro |
By default, expect-strings will read from the current input port.
The first term in each clause consists of an expression evaluating to
a string pattern (regular expression). As characters
are read one-by-one from the port, they are accumulated in a buffer string
which is matched against each of the patterns. When a
pattern matches, the remaining expression(s) in
the clause are evaluated and the value of the last is returned. For example:
(with-input-from-file "/etc/passwd"
(lambda ()
(expect-strings
("^nobody" (display "Got a nobody user.\n")
(display "That's no problem.\n"))
("^daemon" (display "Got a daemon user.\n")))))
The regular expression is compiled with the There are two other ways to write a clause: The expression(s) to evaluate can be omitted, in which case the result of the regular expression match (converted to strings, as obtained from regexec with match-pick set to "") will be returned if the pattern matches. The symbol ("^daemon" => write)
("^d\\(aemon\\)" => (lambda args (for-each write args)))
("^da\\(em\\)on" => (lambda (all sub)
(write all) (newline)
(write sub) (newline)))
The order of the substrings corresponds to the order in which the opening brackets occur. A number of variables can be used to control the behaviour
of
Here's an example using all of the variables:
(let ((expect-port (open-input-file "/etc/passwd"))
(expect-timeout 1)
(expect-timeout-proc
(lambda (s) (display "Times up!\n")))
(expect-eof-proc
(lambda (s) (display "Reached the end of the file!\n")))
(expect-char-proc display)
(expect-strings-compile-flags (logior regexp/newline regexp/icase))
(expect-strings-exec-flags 0))
(expect-strings
("^nobody" (display "Got a nobody user\n"))))
|
| expect clause ... | Macro |
expect is used in the same way as expect-strings,
but tests are specified not as patterns, but as procedures. The
procedures are called in turn after each character is read from the
port, with two arguments: the value of the accumulated string and
a flag to indicate whether end-of-file has been reached. The flag
will usually be #f, but if end-of-file is reached, the procedures
are called an additional time with the final accumulated string and
#t.
The test is successful if the procedure returns a non-false value. If the In the following example, a string will only be matched at the beginning
of the file:
(let ((expect-port (open-input-file "/etc/passwd")))
(expect
((lambda (s eof?) (string=? s "fnord!"))
(display "Got a nobody user!\n"))))
The control variables described for |