(require 'precedence-parse)
or (require 'parse)
This package implements:
This package offers improvements over previous parsers.
?
is substituted for
missing input.
Here are the higher-level syntax types and an example of each. Precedence considerations are omitted for clarity. See section Grammar Rule Definition for full details.
bye
calls the function exit
with no arguments.
- 42
Calls the function negate
with the argument 42
.
x - y
Calls the function difference
with arguments x
and y
.
x + y + z
Calls the function sum
with arguments x
, y
, and
y
.
5 !
Calls the function factorial
with the argument 5
.
set foo bar
Calls the function set!
with the arguments foo
and
bar
.
/* almost any text here */
Ignores the comment delimited by /*
and */
.
{0, 1, 2}
Calls the function list
with the arguments 0
, 1
,
and 2
.
f(x, y)
Calls the function funcall
with the arguments f
, x
,
and y
.
set foo bar;
delimits the extent of the restfix operator set
.
prec:define-grammar
.
The rules are appended to *syn-defs*. The value of
*syn-defs* is the grammar suitable for passing as an argument to
prec:parse
.
*syn-ignore-whitespace*
In order to start defining a grammar, either
(set! *syn-defs* '())
or
(set! *syn-defs* *syn-ignore-whitespace*)
prec:define-grammar
is used to define both the character classes
and rules for tokens.
Once your grammar is defined, save the value of *syn-defs*
in a
variable (for use when calling prec:parse
).
(define my-ruleset *syn-defs*)
prec:define-grammar
and extracted from *syn-defs*.
The token delim may be a character, symbol, or string. A character delim argument will match only a character token; i.e. a character for which no token-group is assigned. A symbols or string will match only a token string; i.e. a token resulting from a token group.
prec:parse
reads a ruleset grammar expression delimited
by delim from the given input port. prec:parse
returns the next object parsable from the given input port,
updating port to point to the first character past the end of the
external representation of the object.
If an end of file is encountered in the input before any characters are
found that can begin an object, then an end of file object is returned.
If a delimiter (such as delim) is found before any characters are
found that can begin an object, then #f
is returned.
The port argument may be omitted, in which case it defaults to the
value returned by current-input-port
. It is an error to parse
from a closed port.
tok:char-group
was called with that character alone.
The argument chars-proc must be a procedure of one argument, a
list of characters. After tokenize
has finished
accumulating the characters for a token, it calls chars-proc with
the list of characters. The value returned is the token which
tokenize
returns.
The argument group may be an exact integer or a procedure of one
character argument. The following discussion concerns the treatment
which the tokenizing routine, tokenize
, will accord to characters
on the basis of their groups.
When group is a non-zero integer, characters whose group number is equal to or exactly one less than group will continue to accumulate. Any other character causes the accumulation to stop (until a new token is to be read).
The group of zero is special. These characters are ignored when parsed pending a token, and stop the accumulation of token characters when the accumulation has already begun. Whitespace characters are usually put in group 0.
If group is a procedure, then, when triggerd by the occurence of an initial (no accumulation) chars character, this procedure will be repeatedly called with each successive character from the input stream until the group procedure returns a non-false value.
The following convenient constants are provided for use with
tok:char-group
.
"0123456789"
.
char-whitespace?
returns true.
This section describes advanced features. You can skip this section on first reading.
The Null Denotation (or nud) of a token is the procedure and arguments applying for that token when Left, an unclaimed parsed expression is not extant.
The Left Denotation (or led) of a token is the procedure, arguments, and lbp applying for that token when there is a Left, an unclaimed parsed expression.
In his paper,
Pratt, V. R. Top Down Operator Precendence. SIGACT/SIGPLAN Symposium on Principles of Programming Languages, Boston, 1973, pages 41-51
the left binding power (or lbp) was an independent property of tokens. I think this was done in order to allow tokens with NUDs but not LEDs to also be used as delimiters, which was a problem for statically defined syntaxes. It turns out that dynamically binding NUDs and LEDs allows them independence.
For the rule-defining procedures that follow, the variable tk may be a character, string, or symbol, or a list composed of characters, strings, and symbols. Each element of tk is treated as though the procedure were called for each element.
Character tk arguments will match only character tokens; i.e. characters for which no token-group is assigned. Symbols and strings will both match token strings; i.e. tokens resulting from token groups.
(list sop
arg1 ...)
is incorporated.
If no NUD has been defined for a token; then if that token is a string, it is converted to a symbol and returned; if not a string, the token is returned.
If no LED has been defined for a token, and left is set, the parser issues a warning.
Here are procedures for defining rules for the syntax types introduced in section Precedence Parsing Overview.
For the rule-defining procedures that follow, the variable tk may be a character, string, or symbol, or a list composed of characters, strings, and symbols. Each element of tk is treated as though the procedure were called for each element.
For procedures prec:delim, ..., prec:prestfix, if the sop
argument is #f
, then the token which triggered this rule is
converted to a symbol and returned. A false sop argument to the
procedures prec:commentfix, prec:matchfix, or prec:inmatchfix has a
different meaning.
Character tk arguments will match only character tokens; i.e. characters for which no token-group is assigned. Symbols and strings will both match token strings; i.e. tokens resulting from token groups.
prec:parse1
is called with binding-power bp.
prec:parse1
; the resulting value is incorporated into the
expression being built. Otherwise, the list of sop and the
expression returned from prec:parse1
is incorporated.
Parsing of commentfix syntax differs from the others in several ways. It reads directly from input without tokenizing; It calls stp but does not return its value; nay any value. I added the stp argument so that comment text could be echoed.
0
until the token
match is reached. If the token sep does not appear between
each pair of expressions parsed, a warning is issued.
0
until the token
match is reached. If the token sep does not appear between
each pair of expressions parsed, a warning is issued.
Returns #t
, #f
or a string; has side effect of printing
according to format-string. If destination is #t
,
the output is to the current output port and #t
is returned. If
destination is #f
, a formatted string is returned as the
result of the call. NEW: If destination is a string,
destination is regarded as the format string; format-string is
then the first argument and the output is returned as a string. If
destination is a number, the output is to the current error port
if available by the implementation. Otherwise destination must be
an output port and #t
is returned.
format-string must be a string. In case of a formatting error
format returns #f
and prints a message on the current output or
error port. Characters are output as if the string were output by the
display
function with the exception of those prefixed by a tilde
(~). For a detailed description of the format-string syntax
please consult a Common LISP format reference manual. For a test suite
to verify this format implementation load `formatst.scm'. Please
send bug reports to lutzeb@cs.tu-berlin.de
.
Note: format
is not reentrant, i.e. only one format
-call
may be executed at a time.
Please consult a Common LISP format reference manual for a detailed description of the format string syntax. For a demonstration of the implemented directives see `formatst.scm'.
This implementation supports directive parameters and modifiers
(:
and @
characters). Multiple parameters must be
separated by a comma (,
). Parameters can be numerical parameters
(positive or negative), character parameters (prefixed by a quote
character ('
), variable parameters (v
), number of rest
arguments parameter (#
), empty and default parameters. Directive
characters are case independent. The general form of a directive
is:
directive ::= ~{directive-parameter,}[:][@]directive-character
directive-parameter ::= [ [-|+]{0-9}+ | 'character | v | # ]
Documentation syntax: Uppercase characters represent the corresponding control directive characters. Lowercase characters represent control directive parameter descriptions.
~A
display
does).
~@A
~mincol,colinc,minpad,padcharA
~S
write
does).
~@S
~mincol,colinc,minpad,padcharS
~D
~@D
~:D
~mincol,padchar,commacharD
~X
~@X
~:X
~mincol,padchar,commacharX
~O
~@O
~:O
~mincol,padchar,commacharO
~B
~@B
~:B
~mincol,padchar,commacharB
~nR
~n,mincol,padchar,commacharR
~@R
~:@R
~:R
~:@R
~P
~@P
y
and ies
.
~:P
~P but jumps 1 argument backward.
~:@P
~@P but jumps 1 argument backward.
~C
~@C
#\
prefixing).
~:C
^C
for ASCII 03).
~F
~width,digits,scale,overflowchar,padcharF
~@F
~E
E
ee).
~width,digits,exponentdigits,scale,overflowchar,padchar,exponentcharE
~@E
~G
~width,digits,exponentdigits,scale,overflowchar,padchar,exponentcharG
~@G
~$
~digits,scale,width,padchar$
~@$
~:@$
~:$
~%
~n%
~&
~n&
~&
and then n-1 newlines.
~|
~n|
~~
~n~
~
<newline>
~:
<newline>
~@
<newline>
~T
~@T
~colnum,colincT
~?
~@?
~(str~)
string-downcase
).
~:(str~)
string-capitalize
.
~@(str~)
string-capitalize-first
.
~:@(str~)
string-upcase
.
~*
~n*
~:*
~n:*
~@*
~n@*
~[str0~;str1~;...~;strn~]
~n[
~@[
~:[
~;
~:;
~{str~}
~n{
~:{
~@{
~:@{
~^
~n^
~n,m^
~n,m,k^
~:A
#f
as an empty list (see below).
~:S
#f
as an empty list (see below).
~<~>
~:^
~mincol,padchar,commachar,commawidthD
~mincol,padchar,commachar,commawidthX
~mincol,padchar,commachar,commawidthO
~mincol,padchar,commachar,commawidthB
~n,mincol,padchar,commachar,commawidthR
~I
~F~@Fi
with passed parameters for
~F
.
~Y
~K
~?.
~!
~_
#\space
character
~n_
#\space
characters.
~/
#\tab
character
~n/
#\tab
characters.
~nC
integer->char
. n must be a positive decimal number.~:S
#<...>
as strings "#<...>"
so that the format output can always
be processed by read
.
~:A
#<...>
as strings "#<...>"
so that the format output can always
be processed by read
.
~Q
~:Q
~F, ~E, ~G, ~$
Format has some configuration variables at the beginning of `format.scm' to suit the systems and users needs. There should be no modification necessary for the configuration that comes with SLIB. If modification is desired the variable should be set after the format code is loaded. Format detects automatically if the running scheme system implements floating point numbers and complex numbers.
symbol->string
so the case type of the
printed symbols is implementation dependent.
format:symbol-case-conv
is a one arg closure which is either
#f
(no conversion), string-upcase
, string-downcase
or string-capitalize
. (default #f
)
#f
)
~E
printing. (default
#\E
)
~A
, ~S
,
~P
, ~X
uppercase printing. SLIB format 1.4 uses C-style
printf
padding support which is completely replaced by the CL
format
padding style.
~
, which is not documented
(ignores all characters inside the format string up to a newline
character). (7.1 implements ~a
, ~s
,
~newline, ~~
, ~%
, numerical and variable
parameters and :/@
modifiers in the CL sense).
~A
and ~S
which print in
uppercase. (Elk implements ~a
, ~s
, ~~
, and
~%
(no directive parameters or modifiers)).
~a
, ~s
, ~c
, ~%
, and ~~
(no directive
parameters or modifiers)).
This implementation of format is solely useful in the SLIB context because it requires other components provided by SLIB.
require
s printf
and scanf
and additionally defines
the symbols:
(current-input-port)
.
(current-output-port)
.
(current-error-port)
.
Each function converts, formats, and outputs its arg1 ... arguments according to the control string format argument and returns the number of characters output.
printf
sends its output to the port (current-output-port)
.
fprintf
sends its output to the port port. sprintf
string-set!
s locations of the non-constant string argument
str to the output characters.
Two extensions of sprintf
return new strings. If the first
argument is #f
, then the returned string's length is as many
characters as specified by the format and data; if the first
argument is a non-negative integer k, then the length of the
returned string is also bounded by k.
The string format contains plain characters which are copied to the output stream, and conversion specifications, each of which results in fetching zero or more of the arguments arg1 .... The results are undefined if there are an insufficient number of arguments for the format. If format is exhausted while some of the arg1 ... arguments remain unused, the excess arg1 ... arguments are ignored.
The conversion specifications in a format string have the form:
% [ flags ] [ width ] [ . precision ] [ type ] conversion
An output conversion specifications consist of an initial `%' character followed in sequence by:
scanf
functions with the `%i' conversion (see section Standard Formatted Input).
6
. If the precision is explicitly 0
,
the decimal point character is suppressed.
For the `%g' and `%G' conversions, the precision specifies how
many significant digits to print. Significant digits are the first
digit before the decimal point, and all the digits after it. If the
precision is 0
or not specified for `%g' or `%G', it is
treated like a value of 1
. If the value being printed cannot be
expressed accurately in the specified number of digits, the value is
rounded to the nearest number that fits.
For exact conversions, if a precision is supplied it specifies the
minimum number of digits to appear; leading zeros are produced if
necessary. If a precision is not supplied, the number is printed with
as many digits as necessary. Converting an exact `0' with an
explicit precision of zero produces no characters.
scanf
for input (see section Standard Formatted Input).
write
(which can be read using read
); otherwise,
output is as display
prints. A precision specifies the maximum
number of characters to output; otherwise as many characters as needed
are output.
Note: `%a' and `%A' are SLIB extensions.
Each function reads characters, interpreting them according to the control string format argument.
scanf-read-list
returns a list of the items specified as far as
the input matches format. scanf
, fscanf
, and
sscanf
return the number of items successfully matched and
stored. scanf
, fscanf
, and sscanf
also set the
location corresponding to arg1 ... using the methods:
set!
set-car!
set-cdr!
vector-set!
substring-move-left!
The argument to a substring
expression in arg1 ... must
be a non-constant string. Characters will be stored starting at the
position specified by the second argument to substring
. The
number of characters stored will be limited by either the position
specified by the third argument to substring
or the length of the
matched string, whichever is less.
The control string, format, contains conversion specifications and other characters used to direct interpretation of input sequences. The control string contains:
Unless the specification contains the `n' conversion character (described below), a conversion specification directs the conversion of the next input field. The result of a conversion specification is returned in the position of the corresponding argument points, unless `*' indicates assignment suppression. Assignment suppression provides a way to describe an input field to be skipped. An input field is defined as a string of characters; it extends to the next inappropriate character or until the field width, if specified, is exhausted.
Note: This specification of format strings differs from the ANSI C and POSIX specifications. In SLIB, white space before an input field is not skipped unless white space appears before the conversion specification in the format string. In order to write format strings which work identically with ANSI C and SLIB, prepend whitespace to all conversion specifications except `[' and `c'.
The conversion code indicates the interpretation of the input field; For a suppressed field, no value is returned. The following conversion codes are legal:
scanf
. No input is consumed by %n
.
scanf
cannot read a null string.
The scanf
functions terminate their conversions at end-of-file,
at the end of the control string, or when an input character conflicts
with the control string. In the latter case, the offending character is
left unread in the input stream.
This routine implements Posix command line argument parsing. Notice
that returning values through global variables means that getopt
is not reentrant.
(vector-ref argv *optind*)
) that matches a letter in
optstring. argv is a vector or list of strings, the 0th of
which getopt usually ignores. argc is the argument count, usually
the length of argv. optstring is a string of recognized
option characters; if a character is followed by a colon, the option
takes an argument which may be immediately following it in the string or
in the next element of argv.
*optind* is the index of the next element of the argv vector
to be processed. It is initialized to 1 by `getopt.scm', and
getopt
updates it when it finishes with each element of
argv.
getopt
returns the next option character from argv that
matches a character in optstring, if there is one that matches.
If the option takes an argument, getopt
sets the variable
*optarg* to the option-argument as follows:
getopt
returns an error
indication.
If, when getopt
is called, the string (vector-ref argv
*optind*)
either does not begin with the character #\-
or is
just "-"
, getopt
returns #f
without changing
*optind*. If (vector-ref argv *optind*)
is the string
"--"
, getopt
returns #f
after incrementing
*optind*.
If getopt
encounters an option character that is not contained in
optstring, it returns the question-mark #\?
character. If
it detects a missing option argument, it returns the colon character
#\:
if the first character of optstring was a colon, or a
question-mark character otherwise. In either case, getopt
sets
the variable getopt:opt to the option character that caused the
error.
The special option "--"
can be used to delimit the end of the
options; #f
is returned, and "--"
is skipped.
RETURN VALUE
getopt
returns the next option character specified on the command
line. A colon #\:
is returned if getopt
detects a missing
argument and the first character of optstring was a colon
#\:
.
A question-mark #\?
is returned if getopt
encounters an
option character not in optstring or detects a missing argument
and the first character of optstring was not a colon #\:
.
Otherwise, getopt
returns #f
when all command line options
have been parsed.
Example:
#! /usr/local/bin/scm ;;;This code is SCM specific. (define argv (program-arguments)) (require 'getopt) (define opts ":a:b:cd") (let loop ((opt (getopt (length argv) argv opts))) (case opt ((#\a) (print "option a: " *optarg*)) ((#\b) (print "option b: " *optarg*)) ((#\c) (print "option c")) ((#\d) (print "option d")) ((#\?) (print "error" getopt:opt)) ((#\:) (print "missing arg" getopt:opt)) ((#f) (if (< *optind* (length argv)) (print "argv[" *optind* "]=" (list-ref argv *optind*))) (set! *optind* (+ *optind* 1)))) (if (< *optind* (length argv)) (loop (getopt (length argv) argv opts)))) (slib:exit)
getopt--
is an extended version of getopt
which parses long option names of the form
`--hold-the-onions' and `--verbosity-level=extreme'.
Getopt--
behaves as getopt
except for non-empty
options beginning with `--'.
Options beginning with `--' are returned as strings rather than
characters. If a value is assigned (using `=') to a long option,
*optarg*
is set to the value. The `=' and value are
not returned as part of the option string.
No information is passed to getopt--
concerning which long
options should be accepted or whether such options can take arguments.
If a long option did not have an argument, *optarg
will be set to
#f
. The caller is responsible for detecting and reporting
errors.
(define opts ":-:b:") (define argc 5) (define argv '("foo" "-b9" "--f1" "--2=" "--g3=35234.342" "--")) (define *optind* 1) (define *optarg* #f) (require 'qp) (do ((i 5 (+ -1 i))) ((zero? i)) (define opt (getopt-- argc argv opts)) (print *optind* opt *optarg*))) -| 2 #\b "9" 3 "f1" #f 4 "2" "" 5 "g3" "35234.342" 5 #f "35234.342"
read-command
converts a command line into a list of strings
suitable for parsing by getopt
. The syntax of command lines
supported resembles that of popular shells. read-command
updates port to point to the first character past the command
delimiter.
If an end of file is encountered in the input before any characters are found that can begin an object or comment, then an end of file object is returned.
The port argument may be omitted, in which case it defaults to the
value returned by current-input-port
.
The fields into which the command line is split are delimited by
whitespace as defined by char-whitespace?
. The end of a command
is delimited by end-of-file or unescaped semicolon (;) or
newline. Any character can be literally included in a field by
escaping it with a backslach (\).
The initial character and types of fields recognized are:
read
starting with this character. The
read
expression is evaluated, converted to a string
(using display
), and replaces the expression in the returned
field.
The comment field differs from the previous fields in that it must be
the first character of a command or appear after whitespace in order to
be recognized. # can be part of fields if these conditions are
not met. For instance, ab#c
is just the field ab#c.
read-dommand-line
and backslashes before newlines in
comments are also ignored.
read-options-file
converts an options file into a list of
strings suitable for parsing by getopt
. The syntax of options
files is the same as the syntax for command
lines, except that newlines do not terminate reading (only ;
or end of file).
If an end of file is encountered before any characters are found that can begin an object or comment, then an end of file object is returned.
Arguments to procedures in scheme are distinguished from each other by their position in the procedure call. This can be confusing when a procedure takes many arguments, many of which are not often used.
A parameter-list is a way of passing named information to a procedure. Procedures are also defined to set unused parameters to default values, check parameters, and combine parameter lists.
A parameter has the form (parameter-name value1
...)
. This format allows for more than one value per
parameter-name.
A parameter-list is a list of parameters, each with a different parameter-name.
parameter-list-ref
returns the value of parameter
parameter-name of parameter-list.
make-parameter-list
which created parameter-list. For each non-false element of
expanders that procedure is mapped over the corresponding
parameter value and the returned parameter lists are merged into
parameter-list.
This process is repeated until parameter-list stops growing. The
value returned from parameter-list-expand
is unspecified.
make-parameter-list
which created parameter-list. fill-empty-parameters
returns a new parameter-list with each empty parameter replaced with the
list returned by calling the corresponding defaulter with
parameter-list as its argument.
make-parameter-list
which created parameter-list.
check-parameters
returns parameter-list if each check
of the corresponding parameter-list returns non-false. If some
check returns #f
an error is signaled.
In the following procedures arities is a list of symbols. The
elements of arities
can be:
single
optional
boolean
nary
nary1
single
and boolean
are converted to
the single value associated with them. The other arity types are
converted to lists of the value(s) of type types.
positions is a list of positive integers whose order matches the
order of the parameter-names in the call to
make-parameter-list
which created parameter-list. The
integers specify in which argument position the corresponding parameter
should appear.
(require 'getopt-parameters)
getopt
. Longer
strings will be treated as long-named options (see section Getopt).
getopt->parameter-list
, but converts argv to an
argument-list as specified by optnames, positions,
arities, types, defaulters, checks, and
aliases.
These getopt
functions can be used with SLIB relational
databases. For an example, See section Database Utilities.
If errors are encountered while processing options, directions for using
the options are printed to current-error-port
.
(begin (set! *optind* 1) (getopt->parameter-list 2 '("cmd" "-?") '(flag number symbols symbols string flag2 flag3 num2 num3) '(boolean optional nary1 nary single boolean boolean nary nary) '(boolean integer symbol symbol string boolean boolean integer integer) '(("flag" flag) ("f" flag) ("Flag" flag2) ("B" flag3) ("optional" number) ("o" number) ("nary1" symbols) ("N" symbols) ("nary" symbols) ("n" symbols) ("single" string) ("s" string) ("a" num2) ("Abs" num3)))) -| Usage: cmd [OPTION ARGUMENT ...] ... -f, --flag -o, --optional=<number> -n, --nary=<symbols> ... -N, --nary1=<symbols> ... -s, --single=<string> --Flag -B -a <num2> ... --Abs=<num3> ... ERROR: getopt->parameter-list "unrecognized option" "-?"
(require 'filename)
or (require 'glob)
These functions interpret the following characters specially in pattern strings:
str
but with the suffix string old
removed and the suffix string new appended. If the end of
str does not match old, an error is signaled.
(replace-suffix "/usr/local/lib/slib/batch.scm" ".scm" ".c") => "/usr/local/lib/slib/batch.c"
The batch procedures provide a way to write and execute portable scripts
for a variety of operating systems. Each batch:
procedure takes
as its first argument a parameter-list (see section Parameter lists). This
parameter-list argument parms contains named associations. Batch
currently uses 2 of these:
batch-port
batch-dialect
`batch.scm' uses 2 enhanced relational tables (see section Database Utilities) to store information linking the names of
operating-system
s to batch-dialect
es.
operating-system
and batch-dialect
tables and adds
the domain operating-system
to the enhanced relational database
database.
batch:platform
is set to (software-type)
(see section Configuration) unless (software-type)
is unix
,
in which case finer distinctions are made.
batch:call-with-output-script
writes an appropriate
header to file and then calls proc with file as the
only argument. If file is a string,
batch:call-with-output-script
opens a output-file of name
file, writes an appropriate header to file, and then calls
proc with the newly opened port as the only argument. Otherwise,
batch:call-with-output-script
acts as if it was called with the
result of (current-output-port)
as its third argument.
#t
if successful, #f
if not.
batch:apply-chop-to-fit
calls proc with arg1,
arg2, ..., and chunk, where chunk is a subset of
list. batch:apply-chop-to-fit
tries proc with
successively smaller subsets of list until either proc
returns non-false, or the chunks become empty.
The rest of the batch:
procedures write (or execute if
batch-dialect
is system
) commands to the batch port which
has been added to parms or (copy-tree parms)
by the
code:
(adjoin-parameters! parms (list 'batch-port port))
batch:try-system
(below) with arguments, but signals an
error if batch:try-system
returns #f
.
These functions return a non-false value if the command was successfully
translated into the batch dialect and #f
if not. In the case of
the system
dialect, the value is non-false if the operation
suceeded.
batch-port
in parms which executes
the program named string1 with arguments string2 ....
batch-port
in parms which executes
the batch script named string1 with arguments string2
....
Note: batch:run-script
and batch:try-system
are not the
same for some operating systems (VMS).
batch-port
in
parms.
batch-port
in parms which create a
file named file with contents line1 ....
batch-port
in parms which deletes
the file named file.
batch-port
in parms which renames
the file old-name to new-name.
In addition, batch provides some small utilities very useful for writing scripts:
(truncate-up-to "/usr/local/lib/slib/batch.scm" "/") => "batch.scm"
equal?
to elements of
list2, then those elements will appear first and in the order of
list1.
equal?
to elements of
list1, then those elements will appear last and in the order of
list2.
batch-dialect
to be used for the
operating-system named osname. os->batch-dialect
uses the
tables added to database by batch:initialize!
.
Here is an example of the use of most of batch's procedures:
(require 'database-utilities) (require 'parameters) (require 'batch) (require 'glob) (define batch (create-database #f 'alist-table)) (batch:initialize! batch) (define my-parameters (list (list 'batch-dialect (os->batch-dialect batch:platform)) (list 'platform batch:platform) (list 'batch-port (current-output-port)))) ;gets filled in later (batch:call-with-output-script my-parameters "my-batch" (lambda (batch-port) (adjoin-parameters! my-parameters (list 'batch-port batch-port)) (and (batch:comment my-parameters "================ Write file with C program.") (batch:rename-file my-parameters "hello.c" "hello.c~") (batch:lines->file my-parameters "hello.c" "#include <stdio.h>" "int main(int argc, char **argv)" "{" " printf(\"hello world\\n\");" " return 0;" "}" ) (batch:system my-parameters "cc" "-c" "hello.c") (batch:system my-parameters "cc" "-o" "hello" (replace-suffix "hello.c" ".c" ".o")) (batch:system my-parameters "hello") (batch:delete-file my-parameters "hello") (batch:delete-file my-parameters "hello.c") (batch:delete-file my-parameters "hello.o") (batch:delete-file my-parameters "my-batch") )))
Produces the file `my-batch':
#!/bin/sh # "my-batch" build script created Sat Jun 10 21:20:37 1995 # ================ Write file with C program. mv -f hello.c hello.c~ rm -f hello.c echo '#include <stdio.h>'>>hello.c echo 'int main(int argc, char **argv)'>>hello.c echo '{'>>hello.c echo ' printf("hello world\n");'>>hello.c echo ' return 0;'>>hello.c echo '}'>>hello.c cc -c hello.c cc -o hello hello.o hello rm -f hello rm -f hello.c rm -f hello.o rm -f my-batch
When run, `my-batch' prints:
bash$ my-batch mv: hello.c: No such file or directory hello world
(require 'html-form)
html:printf
) the strings lines as HTML
comments.
get
, head
, post
,
put
, or delete
. html:start-form
prints the header for an HTML
form.
html:end-form
prints the footer for an HTML form. The string submit-label
appears on the button which submits the form.
command->html
writes an HTML-2.0 form for command command to the
current-output-port. The `SUBMIT' button, which is labeled command,
invokes the URI action with method method with a hidden attribute
*command*
bound to the command symbol submitted.
An action may invoke a CGI script (`http://www.my-site.edu/cgi-bin/search.cgi') or HTTP daemon (`http://www.my-site.edu:8001').
This example demonstrates how to create a HTML-form for the `build' command.
(require (in-vicinity (implementation-vicinity) "build.scm")) (call-with-output-file "buildscm.html" (lambda (port) (fluid-let ((*html:output-port* port)) (html:start-page 'commands) (command->html build '*commands* 'build 'post (or "/cgi-bin/build.cgi" "http://localhost:8081/buildscm")) html:end-page)))
(require 'html-form)
(current-input-port)
and executes the encoded command from command-table
in relational-database rdb.
This example puts up a plain-text page in response to a CGI query.
(display "Content-Type: text/plain") (newline) (newline) (require 'html-form) (load (in-vicinity (implementation-vicinity) "build.scm")) (cgi:serve-command build '*commands*)
*command*
.
http:serve-query
calls serve-proc with two
arguments, the query-string and the header-alist.
Otherwise, http:serve-query
replies (to output-port) with appropriate HTML describing the
problem.
This example services HTTP queries from port 8081:
(define socket (make-stream-socket AF_INET 0)) (socket:bind socket 8081) (socket:listen socket 10) (dynamic-wind (lambda () #f) (lambda () (do ((port (socket:accept socket) (socket:accept socket))) (#f) (dynamic-wind (lambda () #f) (lambda () (fluid-let ((*html:output-port* port)) (http:serve-query port port (lambda (query-string header) (http:send-header '(("Content-Type" . "text/plain"))) (with-output-to-port port (lambda () (serve-urlencoded-command build '*commands* query-string))))))) (lambda () (close-port port))))) (lambda () (close-port socket)))
options
, get
, head
,
post
, put
, delete
, or trace
; Or a string.
(current-input-port)
.
cgi:read-query-string
reads a `"POST"' or `"GET"' queries, depending on the
value of (getenv "REQUEST_METHOD")
.
generic-write
is a procedure that transforms a Scheme data value
(or Scheme program expression) into its textual representation and
prints it. The interface to the procedure is sufficiently general to
easily implement other useful formatting procedures such as pretty
printing, output to a string and truncated output.
#f
to stop the transformation.
The value returned by generic-write
is undefined.
Examples:
(write obj) == (generic-write obj #f #f display-string) (display obj) == (generic-write obj #t #f display-string)
where
display-string == (lambda (s) (for-each write-char (string->list s)) #t)
pretty-print
s obj on port. If port is not
specified, current-output-port
is used.
Example:
(pretty-print '((1 2 3 4 5) (6 7 8 9 10) (11 12 13 14 15) (16 17 18 19 20) (21 22 23 24 25))) -| ((1 2 3 4 5) -| (6 7 8 9 10) -| (11 12 13 14 15) -| (16 17 18 19 20) -| (21 22 23 24 25))
(current-output-port)
.
outfile is a port or a string. If no outfile is specified
then current-output-port
is assumed. These expanded expressions
are then pretty-print
ed to this port.
Whitepsace and comments (introduced by ;
) which are not part of
scheme expressions are reproduced in the output. This procedure does
not affect the values returned by current-input-port
and
current-output-port
.
pprint-filter-file
can be used to pre-compile macro-expansion and
thus can reduce loading time. The following will write into
`exp-code.scm' the result of expanding all defmacros in
`code.scm'.
(require 'pprint-file) (require 'defmacroexpand) (defmacro:load "my-macros.scm") (pprint-filter-file "code.scm" defmacro:expand* "exp-code.scm")
If (provided? 'current-time)
:
The procedures current-time
, difftime
, and
offset-time
deal with a calendar time datatype
which may or may not be disjoint from other Scheme datatypes.
get-universal-time
in section Common-Lisp Time.
(+ caltime offset)
.
(require 'time-zone)
POSIX standards specify several formats for encoding time-zone rules.
-4:30
.
The non-tzfile formats can optionally be followed by transition times specifying the day and time when a zone changes from standard to daylight-savings and back again.
time-zone
cannot interpret TZ-string,
#f
is returned.
tz:params
returns a list of
three items:
tz:params
is unaffected by the default timezone; inquiries can be
made of any timezone at any calendar time.
The rest of these procedures and variables are provided for POSIX compatability. Because of shared state they are not thread-safe.
tzset
also sets the variables *timezone*, daylight?,
and tzname. This function is automatically called by the time
conversion procedures which depend on the time zone (see section Time and Date).
*timezone*
is initialized by tzset
.
#t
if the default timezone has rules for Daylight Savings
Time. Note: daylight? does not tell you when Daylight
Savings Time is in effect, just that the default zone sometimes has
Daylight Savings Time.
(require 'posix-time)
decode-universal-time
.
decode-universal-time
.
localtime
sets the
variable *timezone* with the difference between Coordinated
Universal Time (UTC) and local standard time in seconds
(see section Time Zone).
"Wed Jun 30 21:49:08 1993"
.
(asctime (gmtime caltime))
,
(asctime (localtime caltime))
, and
(asctime (localtime caltime tz))
, respectively.
(decode-universal-time (get-universal-time))
.
current-time
.
gmtime
and localtime
.
gmtime
and localtime
.
Notice that the values returned by decode-universal-time
do not
match the arguments to encode-universal-time
.
Notice that the values returned by decode-universal-time
do not
match the arguments to encode-universal-time
.
Note: The Tektronix graphics support files need more work, and are not complete.
The Tektronix 4000 series graphics protocol gives the user a 1024 by 1024 square drawing area. The origin is in the lower left corner of the screen. Increasing y is up and increasing x is to the right.
The graphics control codes are sent over the current-output-port and can be mixed with regular text and ANSI or other terminal control sequences.
The graphics control codes are sent over the current-output-port and can be mixed with regular text and ANSI or other terminal control sequences.
Schmooz is a simple, lightweight markup language for interspersing Texinfo documentation with Scheme source code. Schmooz does not create the top level Texinfo file; it creates `txi' files which can be imported into the documentation using the Texinfo command `@include'.
(require 'schmooz)
defines the function schmooz
, which is
used to process files. Files containing schmooz documentation should
not contain (require 'schmooz)
.
schmooz
extracts
top-level comments containing schmooz commands from filenamescm
and writes the converted Texinfo source to a file named
filenametxi.
schmooz
calls itself with
the argument `filenamescm'.
Schmooz comments are distinguished (from non-schmooz comments) by their first line, which must start with an at-sign (@) preceded by one or more semicolons (;). A schmooz comment ends at the first subsequent line which does not start with a semicolon. Currently schmooz comments are recognized only at top level.
Schmooz comments are copied to the Texinfo output file with the leading contiguous semicolons removed. Certain character sequences starting with at-sign are treated specially. Others are copied unchanged.
A schmooz comment starting with `@body' must be followed by a Scheme definition. All comments between the `@body' line and the definition will be included in a Texinfo definition, either a `@defun' or a `@defvar', depending on whether a procedure or a variable is being defined.
Within the text of that schmooz comment, at-sign
followed by `0' will be replaced by @code{procedure-name}
if the following definition is of a procedure; or
@var{variable}
if defining a variable.
An at-sign followed by a non-zero digit will expand to the variable citation of that numbered argument: `@var{argument-name}'.
If more than one definition follows a `@body' comment line without an intervening blank or comment line, then those definitions will be included in the same Texinfo definition using `@defvarx' or `@defunx', depending on whether the first definition is of a variable or of a procedure.
Schmooz can figure out whether a definition is of a procedure if it is of the form:
`(define (<identifier> <arg> ...) <expression>)'
or if the left hand side of the definition is some form ending in a lambda expression. Obviously, it can be fooled. In order to force recognition of a procedure definition, start the documentation with `@args' instead of `@body'. `@args' should be followed by the argument list of the function being defined, which may be enclosed in parentheses and delimited by whitespace, (as in Scheme), enclosed in braces and separated by commas, (as in Texinfo), or consist of the remainder of the line, separated by whitespace.
For example:
;;@args arg1 args ... ;;@0 takes argument @1 and any number of @2 (define myfun (some-function-returning-magic))
Will result in:
@defun myfun arg1 args @dots{} @code{myfun} takes argument @var{arg1} and any number of @var{args} @end defun
`@args' may also be useful for indicating optional arguments by name. If `@args' occurs inside a schmooz comment section, rather than at the beginning, then it will generate a `@defunx' line with the arguments supplied.
If the first at-sign in a schmooz comment is immediately followed by whitespace, then the comment will be expanded to whatever follows that whitespace. If the at-sign is followed by a non-whitespace character then the at-sign will be included as the first character of the expansion. This feature is intended to make it easy to include Texinfo directives in schmooz comments.
Go to the first, previous, next, last section, table of contents.