Scheme 48 Manual | Contents | In Chapter: Module system
Previous: The configuration language | Next: Macros


An interface can be thought of as the type of a structure. In its basic form it is just a list of variable names, written (export name ...). However, in place of a name one may write (name type), indicating the type of name's binding. The type field is optional, except that exported macros must be indicated with type :syntax.

Interfaces may be either anonymous, as in the example in the introduction, or they may be given names by a define-interface form, for example

(define-interface foo-interface (export a c cons))
(define-structure foo foo-interface ...)
In principle, interfaces needn't ever be named. If an interface had to be given at the point of a structure's use as well as at the point of its definition, it would be important to name interfaces in order to avoid having to write them out twice, with risk of mismatch should the interface ever change. But they don't.

Still, there are several reasons to use define-interface:

  1. It is important to separate the interface definition from the package definitions when there are multiple distinct structures that have the same interface -- that is, multiple implementations of the same abstraction.
  2. It is conceptually cleaner, and often useful for documentation purposes, to separate a module's specification (interface) from its implementation (package).
  3. Our experience is that configurations that are separated into interface definitions and package definitions are easier to read; the long lists of exported bindings just get in the way most of the time.

The  compound-interface operator forms an interface that is the union of two or more component interfaces. For example,

(define-interface bar-interface
  (compound-interface foo-interface (export mumble)))
defines bar-interface to be foo-interface with the name mumble added.

Previous: The configuration language | Next: Macros