[racket] Best practices for installing and using R6RS libraries with Racket on Windows
Hello,
I've been testing out my MPL libraries with Racket 5.2 on Windows 7.
I generally use R6RS implementations and libraries. Thus, I tend to keep
my library directories in "~/scheme" on Linux or
"c:\users\myhomedir\scheme" on Windows. MPL has two dependencies
(surfage and dharmalab; mentioned in the README) that should also be
present in the library collection.
So to "install" MPL for Racket on Windows, I simply modified my
PLTCOLLECTS environment variable. At first I simply defined it as:
c:\users\dharmatech\scheme
However, having only that directory in PLTCOLLECTS caused major problems
for DrRacket.
My next step was to check the result of:
(get-collects-search-dirs)
and include those paths in PLTCOLLECTS as well. That seemed to do the
trick. So my PLTCOLLECTS variable now looks like:
C:\Users\dharmatech\AppData\Roaming\Racket\5.2\collects;C:\Program Files
(x86)\R
acket\collects;c:\users\dharmatech\scheme
I'd like to provide some basic instructions in the README for getting
started in a Windows environment with Racket and MPL. Should I suggest
that the PLTCOLLECTS variable be modified as I've done above?
Section 6.1.3 of the Racket guide recommends using 'raco link' to
install collections. Would this somehow be better than the PLTCOLLECTS
approach? The drawback to this is that it appears that the user would
have to 'raco link' all three library collections (i.e. surfage,
dharmalab, mpl).
Once installed, MPL appears to function properly. The test suite passes
when I run:
c:\Program Files (x86)\Racket>plt-r6rs
c:\Users\dharmatech\scheme\mpl\test.sps
I recently added an '(mpl all)' library which exports commonly used
procedures and macros. So to get a REPL up an running, in a DrRacket
definitions window add:
#!r6rs
(import (mpl rnrs-sans)
(mpl all))
hit "Run" and the MPL procedures/macros should available in the
interactions window.
I normally write my Scheme code as R6RS libraries, not as Racket modules
and I don't have much experience with the latter. It'd be nice if Racket
module authors could import MPL libraries into their normal racket
modules. Of course, MPL exports procedures that conflict naming-wise
with traditional procedures like +, -, *, /, sin, cos, etc. How should I
handle this in Racket modules? As a first attempt at mixing Racket and
MPL I tried:
#lang racket
(require (lib "mpl/sum-product-power.sls"))
When I multiply 'x' times 'x' I get:
> (* 'x 'x)
(mcons '^ (mcons 'x (mcons 2 '())))
In Petite Chez Scheme I get:
> (* 'x 'x)
(^ x 2)
I guess the 'mcons' stuff is due to the mutable/immutable pairs
difference between R6RS and default racket.
In R6RS, as shown above, I usually do '(import (mpl rnrs-sans) (mpl
all))'. The library '(mpl rnrs-sans)' is equivalent to '(rnrs)' except
for procedures which conflict name-wise with MPL procedures. Would you
recommend setting up something similar for Racket so that the user can do:
#lang racket-sans
(require (lib "mpl/all.sls"))
Thanks for any hints and tips!
The MPL github project page is at:
https://github.com/dharmatech/mpl
Ed