David Roundy <[EMAIL PROTECTED]> writes:
> Here "bug" is a function that just calls "error" with a little prefix
> explaining that there is a bug in darcs, and would the user please report
> it. Obviously, defining a head here would be just as easy,
Cool! The basic trick is just to inline the actual function
defintions using CPP macros. I've made macros for most of the
troublesome functions, but I can't get it to work for operators
(something like `(!!)` doesn't parse, it seems) Any tricks?
Unless I'm overlooking something, I could have a file prelude.h
containing something like:
----8<------
import Prelude hiding (head,(!!),read)
#define head (\xs -> case xs of { (x:_) -> x ; _ -> bug "head" __FILE__ __LINE__})
#define at (let {at (y:_) 0 = y; at (y:ys) n = at ys (n-1); at _ _ = bug "at"
__FILE__ __LINE__} in \a x -> at a x)
#define read (\s -> case [ x | (x,t) <- reads s, ("","") <- lex t] of { [x] -> x ; _
-> bug "read" __FILE__ __LINE__})
#define fromJust (\x -> case x of Just a -> a; Nothing -> bug "fromJust" __FILE__
__LINE__)
bug c f l = error ("Program error - illegal parameters to '"++c++"', file '"++f++"',
line "++show l)
----8<------
and just #include "prelude.h" if/when I want better debugging. No
expensive stack frames, no unwanted strictness, and no clutter.
Any comments?
-kzm
--
If I haven't seen further, it is by standing in the footprints of giants
_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe