[racket] Best practices for installing and using R6RS libraries with Racket on Windows

From: Eduardo Cavazos (wayo.cavazos at gmail.com)
Date: Thu Jan 19 16:40:10 EST 2012

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

Posted on the users mailing list.