4 Extending DrRacket
DrRacket supports two forms of extension to the programming environment:
A teachpack extends the set of procedures that are built into a language in DrRacket. 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.
See Teachpacks for information in creating teachpacks.
A plugin extends the set of utilities within the DrRacket environment. For example, DrRacket’s Check Syntax button starts a syntax-checking plugin. For information on creating plugins, see DrRacket Plugins.
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, and
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 Racket source file defines a teachpack (although the file may access other files via require). The file must contain a module (see Modules). 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, the following teachpack provides a lazy cons implementation. To test it, save the following in a file and add the file as a teachpack (or use require).
#lang racket (provide (rename-out [:lcons lcons]) lcar lcdr) (define-struct lcons (hd tl)) (define-syntax (:lcons stx) (syntax-case stx () [(_ hd-exp tl-exp) #'(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" sub-collection in the "teachpack" collection of the PLT installation.
4.1.1 Adding Your Own Teachpacks to the Teachpack Dialog
The Language|Add Teachpack... dialog is extensible in two ways. First, users can add teachpacks to the third column by clicking the button at the bottom of the column. These additions are stored in the preferences file, so one way to add site-specific teachpacks is to provide a default preferences file.
The first two columns are also extensible. When a collection has an "info.rkt" file (see "info.rkt" File Format) that defines htdp-teachpacks or 2htdp-teachpacks, then they are expected to be either a list of (collection-relative) paths containing teachpacks to add to the dialog, or the symbol 'all, which means that all of the (top-level) files in the collection that end with a module suffix (including ".rkt", ".ss", or ".scm") are teachpacks (except "info.rkt" or "info.ss").
4.1.2 Extending Help Desk Search Context
In How to Design Programs Teaching Languages, the search context for the Search in Help Desk for ... item in the pop-up menu can be extended by defining the 2htdp:teachpack-modules binding in the info.rkt file (see "info.rkt" File Format). The 2htdp:teachpack-modules binding should evaluate to a list of symbols representing the module paths to be included in the search context.
For example, the following info.rkt file
#lang info (define scribblings '(("scribblings/intro101.scrbl"))) (define 2htdp:teachpack-modules '(intro101/file-operations intro101/iterated))
includes the modules intro101/file-operations and intro101/iterated in the help desk search context.
4.2 Environment Variables
Several environment variables can affect DrRacket’s behavior:
PLTNOTOOLS : When this environment variable is set, DrRacket doesn’t load any tools.
PLTONLYTOOL : When this environment variable is set, DrRacket 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).
PLTDRREPL : When this environment variable is set, DrRacket starts a read-eval-print loop with all of the forms and functions from the racket module and those described in DrRacket Plugins.
If it is not set to -q, then (find-system-path 'init-file) is loaded as well.
A new thread is created to evaluate REPL expressions, so be sure to use queue-callback to evaluate expressions that mutate the GUI (to avoid race-conditions).
PLTDRCM : When this environment variable is set, DrRacket installs the compilation manager before starting up, which means that the ".zo" files are automatically kept up to date, as DrRacket’s (or a tool’s) source is modified.
If the variable is set to trace then the files that are actually recompiled are shown.
PLTDRPAR : When this environment variable is set, DrRacket uses parallel-compile-files to compile the framework and the drracket collections in parallel and then installs the compilation manager before starting up, which means that the ".zo" files are automatically kept up to date, as DrRacket’s (or a tool’s) source is modified.
If the variable is set to trace then the files that are actually recompiled are shown.
PLTDRDEBUG : When this environment variable is set, DrRacket starts up with errortrace enabled. If the variable is set to profile, DrRacket also records profiling information about itself.
PLTDRPROFILE : When this environment variable is set, DrRacket uses the profile library (with a little GUI) to collect profiling information about itself.
PLTDRBREAK : When this environment variable is set, DrRacket creates a window with a break button, during startup. Clicking the button breaks DrRacket’s eventspace’s main thread. This works well in combination with PLTDRDEBUG since the source locations are reported for the breaks.
PLTSTRINGCONSTANTS : When this environment variable is set, DrRacket 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 "string-constants" collection) 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 raco setup with the -c flag, set the environment variable, and then run raco setup again.
PLTDRXREFDELAY : When this environment variable is set, DrRacket uses an ordinary delay (instead of delay/idle) to delay the computation of the searching indices. This means that Check Syntax will start more slowly the first time, but that the startup performance is more predictable. In addition, when the environment variable is set, DrRacket will print out that it is set, and will print when the index is started loading and when it finishes loading.
PLTDREASTERSECONDS : When this environment variable is set, DrRacket pretends that the result of current-seconds is actually this environment variable’s value, for the purposes of easter eggs. For example, setting it to 1339390801 would simulate King Kamehameha day 2012 and show the corresponding easter egg splash screen.