The _Essentials of Programming Languages_ (a.k.a _EoPL_) language in DrScheme provides all of the functions of R5RS, plus the forms and procedures described below. It is intended for use with the textbook Essentials of Programming Languages, Second Edition Friedman, Wand, and Haynes MIT Press, 2001 Differences from the book: * Datatypes must be defined before they are used in `cases' expressions. This constraint enables better and earlier error reporting. Some examples in the book's code (or at least the code distributed for the book) must be changed by moving datatype definitions earlier. * The sllgen: functions have been changed to syntactic forms. This change is also related to better error reporting. All examples in the book work work with the sllgen: forms. ---------------------------------------- > (define-datatype id predicate-id (variant-id (field-id predicate-expr) ...) ...) Defines the datatype `id' and a function `predicate-id' that returns #t for instances of the datatype, and #f for any other value. Each `variant-id' is defined as a constructor function that creates an instance of the datatype; the constructor takes as many arguments as the variant's `field-id's, and each argument is checked by applying the function produced by the variant's `predicate-expr'. In DrScheme v209 and older, when constructor-based printing was used, variant instances were printed with a `make-' prefix before the variant name. Thus, for compatibility, in addition to `variant-id', `make-variant-id' is also defined for each `variant-id' (to the same constructor as `variant-id'). > (cases datatype-id expr (variant-id (field-id ...) result-expr ...) ...) > (cases datatype-id expr (variant-id (field-id ...) result-expr ...) ... (else result-expr ...)) Branches on the datatype instance produced by `expr', which must be an instance of the specified `datatype-id' (previously defined with `define-datatype'). > sllgen:make-string-scanner > sllgen:make-string-parser > sllgen:make-stream-parser > sllgen:make-define-datatypes > sllgen:show-define-datatypes > sllgen:list-define-datatypes Defined in the EoPL textbook's Appendix A. However, the DrScheme versions are syntactic forms, instead of procedures, and the arguments must be either quoted literal tables or identifiers that are defined (at the top level) to quoted literal tables. > sllgen:make-rep-loop Defined in the EoPL textbook's Appendix A (and still a function). > eopl:error As in the book. > eopl:printf > eopl:pretty-print Same as MzScheme's `printf' and `pretty-print'. > list-of > always? As in the book. > empty The empty list. > (time expr) Evaluates `expr', and prints timing information before returning the result. > (collect-garbage) Performs a garbage collection (useful for repeatable timings). > (trace id ...) > (untrace id ...) For debugging: `trace' redefines each `id' at the top level (bound to a procedure) so that it prints arguments on entry and results on exit. `untrace' reverses the action of `trace' for the given `id's. Tracing a function causes tail-calls in the original function to become non-tail calls. > (provide provide-spec ...) Useful only with a module that uses _(lib "eopl.ss" "eopl")_ as a language: exports identifiers from the module. See the MzScheme manual for information on `provided-spec'. > eopl:error-stop Defined only in the top-level namespace (i.e., not in a module); mutate this variable to install an exception-handling thunk. Typically, the handler thunk escapes through a continuation. The "eopl.ss" module sets this variable to #f in the current namespace when it executes. > (install-eopl-exception-handler) Sets MzScheme's exception handler to one that checks `eopl:error-stop'. The "eopl.ss" module calls this function when it executes.