[REBOL] Re: Tools for Rebol Coders
From: joel:neely:fedex at: 8-Jan-2002 13:32
Hi, Greg, Sunanda, et al...
Gregg Irwin wrote:
> > -- I write some code that calls something from your site
> > that calls something from someone else's. And at some point
> > it crashes with an "Error near a / b".
> >
> > Is that my code or yours or the other person's or a Rebol-
> > supplied mezzanine function? I don't care how un-purist it
> > is to expect the call stack to be printed. But I need it at
> > this point or the application is dead in the water.
>
> I think this points out that we, as REBOL developers, need to
> take into account the context in which our code is intended to
> be used. I can appreciate being able to write simple reblets
> that are self-contained and often times may get by with a
> minimum of error handling and formal design.
>
> If you are writing code to be used in distributed applications,
> you darn well better have everything error trapped and be as
> helpful as possible when it comes to tracking down errors. I
> think Design by Contract will be enormously helpful in that
> regard but I haven't had time to work up a dialect implementing
> it yet.
>
Let's not forget what REBOL alreay provides, which most of us
(myself included) probably don't use to full benefit. Pretend
that I have some REBOL source files from elsewhere:
8<----"buggyfunc.r"---------------------------------------------
REBOL []
buggyfunc: func [a [integer!] b [integer!]] [a / b]
8<--------------------------------------------------------------
and
8<----"buggywrap.r"---------------------------------------------
REBOL []
buggywrap: func [n [integer!] /local r]
[ r: copy []
either even? n
[ repeat i n [append r 5040 / i]]
[ repeat i n [append r 5040 / (8 - i)]]
r
]
8<--------------------------------------------------------------
and now I want to use those bits of scriptage myself.
I can write:
8<----"buggytest.r"---------------------------------------------
REBOL []
do %buggyfunc.r
do %buggywrap.r
testbug: func [n [integer!] /local r]
[ either error? r: try [buggywrap n]
[ print ["Oops! buggywrap blew up when called with" n "!"]]
[ print ["Pretend to do something useful" newline tab mold r]]
]
8<--------------------------------------------------------------
which wraps the "untrusted" code in a TRY evaluation to let me
know whether (and under what circumstances) the foreign code may
cough and die.
>> do %buggytest.r
>> testbug 5
Pretend to do something useful
[720 840 1008 1260 1680]
>> testbug 6
Pretend to do something useful
[5040 2520 1680 1260 1008 840]
>> testbug 7
Pretend to do something useful
[720 840 1008 1260 1680 2520 5040]
>> testbug 8
Pretend to do something useful
[5040 2520 1680 1260 1008 840 720 630]
>> testbug 9
Oops! buggywrap blew up when called with 9 !
I suspect that some creative uses of TRY would go a long way toward
addressing the issues of making more robust code (even when it uses
other, untrusted, foreign components).
-jn-