[REBOL] Re: Enabling the REBOL community
From: joel:neely:fedex at: 8-May-2001 22:30
Hi, John, (and everybody else)
Just a couple of suggestions...
John Schuhr wrote:
> Hi List:
>
> This is a first pass at targeting what Joel suggested...
>
> 8<------------------------------------------------------------------
> REBOL [
> Title: "Rebol Unit Manager"
> File: "unit.r"
> Author: "John Schuhr"
> Version: 0.1.0
> Date: 8-Aug-2001
> ]
>
> unit: make object! [
> lib-paths: [%/c/rebol/lib]
> add-lib-path: func [new-path [file!]] [
> append lib-paths new-path
> ]
> new: func [requested-unit [file!] /local new-unit valid-unit] [
> valid-unit: make logic! false
> foreach lib-path lib-paths [
> requested-unit-location: join lib-path join "/"
> join requested-unit ".r"
> if exists? requested-unit-location [
> new-unit: do requested-unit-location
> valid-unit: true
> break
> ]
> ]
> if equal? valid-unit false [
> make error! "Invalid unit specified"
> ]
> new-unit
> ]
> ]
>
> protect [unit]
>
> 8<------------------------------------------------------------------
Good start! Note that the JOIN convention also allows one to write
such things as
cdf-parser: unit/new %textproc/parsers/cdf
I suggest that unit.r (or whatever we come up with) be invoked from
within user.r (or maybe rebol.r????) so that it is just always
there,
even when running interactively.
The NEW function can tightened up a tad, as follows:
new: func [requested-unit [file!] /local new-unit] [
foreach lib-path lib-paths [
if exists? requested-unit-location:
join lib-path ["/" requested-unit ".r"]
[
return do requested-unit-location
]
]
make error! "Unknown unit specified"
]
The point of the rewording to "Unknown unit specified" is to allow
for the possibility of changing the body of the loop to
if exists? requested-unit-location:
join lib-path join "/" join requested-unit ".r"
[
if error? try [
return do requested-unit-location
][
return make error!
join "Error doing unit '" [
to-string requested-unit "'"
]
]
]
if one really wants distinct and meaningful error messages.
Another suggestion, for cross-platform portability, is to start
with an empty lib-paths block. If unit.r itself is DOne in
the user.r file, then user.r could actually contain something like
do %/usr/local/bin/rebol-lib/unit.r
unit/add-lib-path %/usr/local/bin/rebol-lib
unit/add-lib-path %/home/myacct/rebol-dev/lib
on one box, and
do %/c/rebol/unit.r
unit/add-lib-path %/c/rebol/lib
on another. That way the code within unit.r doesn't have to be
touched if I install it on a new platform.
All that said, the larger meta-question remains, "Is this -- or
something close -- a sufficient mechanism that we could begin to
use it as a de facto standard within the community?"
If so, can we begin to think about some of the other points,
such as a conventional tree structure for the units to live in,
and (harder) do we need a way to keep units from messing with
the global namespace?
-jn-