#
Chapter 4
Extending DrScheme

DrScheme supports two forms of extension to the programming environment:

- A teachpack extends the set of procedures that are built into a language in DrScheme. For example, a teachpack might extend the Beginning Student language with a procedure for playing sounds.

  Teachpacks are particularly useful in a classroom setting, where an instructor can provide a teachpack that is designed for a specific exercise. To use the teachpack, each student must download the teachpack file and select it through the `Language``|``Add Teachpack...` menu item.

- A tool extends the set of utilities within the DrScheme environment. For example, DrScheme's `Check Syntax` button starts a syntax-checking tool.

## 4.1 Teachpacks

Teachpacks are designed to supplement student programs with code that cannot be expressed in a teaching language. For example, to enable students to play hangman, we supply a teachpack that

- implements the random choosing of a word

- maintains the state variable of how many guesses have gone wrong

- manages the GUI.

All these tasks are beyond students in the third week and/or impose memorization of currently useless knowledge on students. The essence of the hangman game, however, is not. The use of teachpacks enables the students to implement the interesting part of this exercise and still be able to enjoy today's graphics without the useless memorization.

A single Scheme source file defines a teachpack (although the file may access other files via `require`). The file must contain a module, according to the naming convention laid out in the MzScheme manual (the name of the file must be the name of the module, with an additional `.scm` or `.ss` extension on the filename). Each exported syntax definition or value definition from the module is provided as a new primitive form or primitive operation to the user, respectively.

As an example example, the following teachpack provides a lazy cons implementation. To test it, be sure to save it in a file named `lazycons.scm`.

    (module lazycons mzscheme
      (provide (rename :lcons lcons) lcar lcdr)

      (define-struct lcons (hd tl))

      (define-syntax (:lcons stx)
        (syntax-case stx ()
          [(_ hd-exp tl-exp)
           (syntax (make-lcons
                     (delay hd-exp)
                     (delay tl-exp)))]))

      (define (lcar lcons) (force (lcons-hd lcons)))
      (define (lcdr lcons) (force (lcons-tl lcons))))

Then, in this program:

    (define (lmap f l)
      (lcons
       (f (lcar l))
       (lmap f (lcdr l))))

    (define all-nums (lcons 1 (lmap add1 all-nums)))

the list `all-nums` is bound to an infinite list of ascending numbers.

For more examples, see the `htdp` directory of the `teachpack` directory in the PLT installation.

## 4.2 Tools

A separate manual describes the mechanism for defining a tool. See PLT Tools: DrScheme Extension Manual.

## 4.3 Environment Variables

This section lists the environment variables that affect DrScheme's behavior. See the MzScheme manual for general information about environment variables.

- PLTNOTOOLS When this environment variable is set, DrScheme doesn't load any tools.

- PLTONLYTOOL When this environment variable is set, DrScheme only loads the tools in the collection named by the value of the environment variable. If the variable is bound to a parenthesized list of collections, only the tools in those collections are loaded (The contents of the environment variable are `|`read| and expected to be a single symbol or a list of symbols).

- PLTDRCM When this environment variable is set, DrScheme installs the compilation manager before starting up, which means that the .zo files are automatically kept up to date, as DrScheme's (or a tools) source is modified.

  If the variable is set to trace then CM's output is traced, using the `manager-trace-handler` procedure from the CM library.

- PLTHDCM When this environment variable is set, Help Desk installs the compilation manager before starting up (but only in standalone mode), which means that the .zo files are automatically kept up to date, as Help Desk's source is modified.

  If the variable is set to trace then CM's output is traced, using the `manager-trace-handler` procedure from the CM library.

- PLTDRDEBUG When this environment variable is set, DrScheme starts up with errortrace enabled. If the variable is set to profile, DrScheme also records profiling information about itself.

- PLTDRBREAK When this environment variable is set, DrScheme creates a window with a break button, during startup. Clicking the button breaks DrScheme's eventspace's main thread. This works well in combination with PLTDRDEBUG since the source locations are reported for the breaks.

- PLTDRTESTS When this environment variable is set, DrScheme installs a special button in the button bar that starts the test suite. (This is only available in the source distribution)

- PLTSTRINGCONSTANTS When this environment variable is set, DrScheme prints out the string constants that have not yet been translated. If it is set to a particular language (corresponding to one of the files in plt/collects/string-constants) it only shows the unset string constants matching that language.

  This environment variable must be set when .zo files are made. To ensure that you see its output properly, run setup-plt with the -c option, set the environment variable, and then run setup-plt again.