Release notes for version 4.04—7/99 Weak library changes: “Finalise” is now spelt “finalize” in all function names. finalize now runs the finalizer immediately, and waits for it to complete before returning. mkWeak now takes a Maybe (IO ()) for the finalizer, and mkWeakNoFinalizer is removed. A weak pointer whose key is itself a weak pointer will now do the right thing. Changed representation of Integer type to speed up computations on small integers. The performance of Integer is now only slightly slower than Int for values between minBound::Int and maxBound::Int. On Win32 platforms, added support for using (and producing) dynamic link libraries (DLLs) containing ghc-compiled code. Added for unboxing/unpacking strict constructor fields. GHC now has a license! See . Added CPR analysis, which reduces allocation by unboxing function results (thanks to Kevin Glynn keving@cs.mu.oz.au). UsageSP analysis added, but not yet functional. Added a simple common sub-expression analysis pass. Implemented update-in-place for certain very restricted cases. Replaced GHC's old and worn yacc/lex parser with a new one based on Happy. Fixed several Haskell 98 non-conformance issues in the process. Added Concurrent.yield :: IO (). Added RULES pragma—transformation rules for Haskell source. This is used for list fusion: now intermediate lists between map, foldr, list comprehensions are removed automatically. Unregisterised/unmangled builds now work. Much performance tuning: GHC 4.04 produces faster code than all previous compilers. GHC now defines __HASKELL98__ when compiling files with . hppa1.1-hp-hpux port reinstated. New operations for unsafely thawing byte arrays: unsafeThaw{Byte,ST,IO}Array. mkdependHS now lives in GHC's lib directory, not the binary directory. It isn't intended to be run standalone, only via ghc -M. Asynchronous exceptions are now supported (see the libary documentation for Concurrent Haskell). New operations: Exception.killThread now raises an exception (AsyncException.KilledThread) in the killed thread. Exception.raiseInThread allows a thread to raise an exception in another thread. Concurrent.myThreadId returns the ThreadId of the calling thread. Stack overflow results in AsyncException.StackOverflow being raised in the offending thread. Assertion failures now raise an AssertionFailed exception. Added simple high-level interface to the Regex library, see the libraries manual. forkIO now handles any uncaught exceptions cleanly. integer2Int# isn't sign preserving any longer, but modulo (maxBound::Int + 1) * 2. is now called . Signal handling with the Posix library now works. Many, many bugs fixed.