doc.txt

Scripting: Utilities for writing Scheme scripts

_Scripting: Utilities for writing Scheme scripts_
=================================================

By Ryan Culpepper (ryanc at ccs dot neu dot edu)

Keywords: _script_, _scripting_, _files_, _system_

----------------------------------------
_byteslike.ss_
----------------------------------------

To use: (require (planet "byteslike.ss" ("ryanc" "scripting.plt" 1)))

Some functions can accept either a bytes or a string for a particular
argument. This module provides a predicate, conversion functions, and
utility procedures for byteslike values.

This module uses utf8 encoding for all conversions. If you care about
the actual encoding being used, do not use this module.

> type byteslike
       ::= bytes
         | string

> (byteslike? any) -> boolean

Predicate for byteslike values.

> (byteslike->bytes byteslike) -> bytes

Identify function on bytes; converts strings to bytes using utf8.

> (byteslike->string byteslike) -> string

Identity function on strings; converts bytes to strings using utf8.

> (byteslike-append byteslike ...) -> byteslike

Appends many byteslikes into a single byteslike.

----------------------------------------
_pathlike.ss_
----------------------------------------

To use: (require (planet "pathlike.ss" ("ryanc" "scripting.plt" 1)))

Paths, strings, and bytes can all be used to refer to filesystem
entities, and all interact differently with other parts of the
system. For example, when composing command string to invoke using
system, paths must be converted to string form. This module provides a
predicate and conversion utilities for a pathlike type.

> type pathlike
      ::= path
        | string

> (pathlike? any) -> boolean

Predicate for pathlike values.

> (pathlike->path pathlike) -> path
> (pathlike->string pathlike) -> string

Converts a pathlike into one of its specific data representations.

> (pathlike->bytes pathlike) -> bytes

Converts a pathlike into a bytes (note that a bytes is not a pathlike).


----------------------------------------
_loud.ss_
----------------------------------------

To use: (require (planet "loud.ss" ("ryanc" "scripting.plt" 1)))

It is helpful for a script to echo to the screen the actions it is
performing on the filesystem and the command lines it is
invoking. This module defines versions of many filesystem and process
procedures that echo their arguments to the current output port.

For example, executing (loud:delete-file "foo.txt") will print out

  delete-file: "foo.txt"

when the procedure is called (it does not imply that the deletion
succeeds).

The following procedures have the same filesystem effect as their
mzscheme counterparts:

> (loud:make-directory pathlike) -> void
> (loud:delete-directory pathlike) -> void
> (loud:copy-file pathlike pathlike) -> void
> (loud:delete-file pathlike) -> void
> (loud:rename-file-or-directory pathlike pathlike) -> void

The following procedures have the same filesystem effect as their 
(lib "file.ss") counterparts:

> (loud:make-directory* pathlike) -> void
> (loud:copy-directory/files pathlike pathlike) -> void
> (loud:delete-directory/files pathlike) -> void

The following procedures have the same process effect as their
(lib "process.ss") counterparts:

> (loud:system string) -> boolean
> (loud:system* string string ...) -> boolean
> (loud:system/exit-code string) -> integer
> (loud:system*/exit-code string string ...) -> integer

> (loud:process string) -> (list input-port output-port number input-port (symbol -> any))
> (loud:process* string string ...) -> (list input-port output-port number input-port (symbol -> any))
> (loud:process/ports output-port/#f input-port/#f output-port/#f string) -> (list input-port/#f output-port/#f number input-port/#f (symbol -> any))
> (loud:process*/ports output-port/#f input-port/#f output-port/#f string string ...) -> (list input-port/#f output-port/#f number input-port/#f (symbol -> any))

----------------------------------------
_read.ss_
----------------------------------------

To use: (require (planet "read.ss" ("ryanc" "scripting.plt" 1)))

Scripts often need to read configuration files and data files, and it
is often convenient to do so in one gulp (the DOM approach, rather
than the SAX/event approach).

> (read-all [input-port]) -> (list-of s-expr)

Calls read repeatedly until end of file and returns a list of the
s-expressions read (not including the end of file object).

> (read-all/file pathlike) -> (list-of s-expr)

Calls read-all on the contents of the given file.

> (read-all-syntax [any [input-port [offset-list]]]) -> (list-of syntax)

Calls read-syntax repeatedly until end of file and returns a list of
the syntax object read (not including the end of file object). See the
description of _read-syntax_ for details on the source and offset-list
arguments.

> (read-all-syntax/file pathlike) -> (list-of syntax)

Calls read-all-syntax on the contents of the given file. Uses the
pathlike object as the source argument.

----------------------------------------
_file.ss_
----------------------------------------

To use: (require (planet "file.ss" ("ryanc" "scripting.plt" 1)))

This module provides procedures for manipulating paths, performing
filesystem queries and actions.

The following procedures only manipulate path representations. They do
not touch the filesystem.

> (path-wrt-path pathlike pathlike) -> path

Interprets the second path with respect to the first. If the second
path is absolute, the first path is ignored. The resulting path is
relative if both input paths were relative; otherwise, it is absolute.

For example: 
  (path-wrt-path "here" "there.txt") = #<path: here/there.txt>
  (path-wrt-path "/home/me" "/tmp/foo") = #<path: /tmp/foo>

> (replace-file-extension pathlike byteslike) -> path

Like path-replace-suffix in mzscheme, but slightly different.

  (replace-file-extension "a.b" "c") = #<path: a.c>

> (pathlike-append pathlike ...) -> path

Like string-append, but accepts bytes and path arguments (*not* like
build-path). For example:

  (pathlike-append "email" "-number-" #<path: 45.txt>) = #<path: email-number-45.txt>

The following procedures interact with the filesystem.

> (touch pathlike) -> void

Creates a file with no contents. If the file already exists, nothing
is done (the modification time is not be updated).

> (check-file-exists name-symbol pathlike) -> void

If the given file does not exist, raises an exception using
raise-file-not-found with the given name as plaintiff.

> (directory-list/sorted [pathlike]) -> (list-of path)

Returns the sorted contents of the given (or current) directory.

> (directory-list/paths pathlike) -> (list-of path)

The procedure directory-list returns a list of paths representing only
the entry names. This procedure (directory-list/paths) returns a list
of paths to the contents of the directory. If the directory was given
as a relative path, they are relative to the current directory;
otherwise, they are absolute paths.

> (directory-list/absolute pathlike) -> (list-of absolute-path)

Returns a list of absolute paths referring to the contents of the
given directory. The directory may be given as either a relative or
absolute path.

> (newer? pathlike pathlike) -> boolean

Indicates whether the file indicated by the first path is newer than
the second. If the second file does not exist, then the first is
trivially newer.

----------------------------------------
_error.ss_
----------------------------------------

To use: (require (planet "error.ss" ("ryanc" "scripting.plt" 1)))

This module provides additional exception structure types and
exception-raising procedures.

> (define-struct (exn:fail:filesystem:path exn:fail:filesystem) (path))

> (raise-file-not-found name-symbol pathlike) -> raises exn

Raises an exception of type exn:fail:filesystem:path with a "file not
found" message and the given path.

----------------------------------------
_misc.ss_
----------------------------------------

To use: (require (planet "misc.ss" ("ryanc" "scripting.plt" 1)))

> (map/separated item-proc separator-proc items) -> list
> (for-each/separated item-proc separator-proc items) -> void

Like map and for-each, but calls separator-proc on no arguments
between every pair of items in the list. If the list contains fewer
than two items, separator-proc will never be called.

> (format-byte-count integer) -> string

Displays a number as a byte count (eg, "12 KB", "153 GB").

> (hash-table-put-fresh! hashtable key value) -> void

Like hash-table-put!, but raises an exception if there is already a
value associated with that key.