1. 24 Oct, 2000 3 commits
2. 23 Oct, 2000 5 commits
3. 20 Oct, 2000 1 commit
4. 19 Oct, 2000 1 commit
5. 17 Oct, 2000 3 commits
6. 16 Oct, 2000 7 commits
7. 13 Oct, 2000 3 commits
8. 12 Oct, 2000 5 commits
9. 11 Oct, 2000 2 commits
10. 03 Oct, 2000 2 commits
• [project @ 2000-10-03 14:35:31 by qrczak] · 85339386
qrczak authored
`Added eqString_RDR to implicitFVs.`
• [project @ 2000-10-03 08:43:00 by simonpj] · 710e2074
simonpj authored
```--------------------------------------
--------------------------------------

This big commit adds Hinze/PJ-style generic class definitions, based
on work by Andrei Serjantov.  For example:

class Bin a where
toBin   :: a -> [Int]
fromBin :: [Int] -> (a, [Int])

toBin {| Unit |}    Unit	  = []
toBin {| a :+: b |} (Inl x)   = 0 : toBin x
toBin {| a :+: b |} (Inr y)   = 1 : toBin y
toBin {| a :*: b |} (x :*: y) = toBin x ++ toBin y

fromBin {| Unit |}    bs      = (Unit, bs)
fromBin {| a :+: b |} (0:bs)  = (Inl x, bs')    where (x,bs') = fromBin bs
fromBin {| a :+: b |} (1:bs)  = (Inr y, bs')    where (y,bs') = fromBin bs
fromBin {| a :*: b |} bs  	  = (x :*: y, bs'') where (x,bs' ) = fromBin bs
(y,bs'') = fromBin bs'

Now we can say simply

instance Bin a => Bin [a]

and the compiler will derive the appropriate code automatically.

(About 9k lines of diffs.  Ha!)

Generic related things
~~~~~~~~~~~~~~~~~~~~~~

* basicTypes/BasicTypes: The EP type (embedding-projection pairs)

* types/TyCon:
An extra field in an algebraic tycon (genInfo)

* types/Class, and hsSyn/HsBinds:
Each class op (or ClassOpSig) carries information about whether
it  	a) has no default method
b) has a polymorphic default method
c) has a generic default method
There's a new data type for this: Class.DefMeth

* types/Generics:
A new module containing good chunk of the generic-related code
It has a .hi-boot file (alas).

* typecheck/TcInstDcls, typecheck/TcClassDcl:
Most of the rest of the generics-related code

* hsSyn/HsTypes:
New infix type form to allow types of the form
data a :+: b = Inl a | Inr b

* parser/Parser.y, Lex.lhs, rename/ParseIface.y:
Deal with the new syntax

* prelude/TysPrim, TysWiredIn:
Need to generate generic stuff for the wired-in TyCons

* rename/RnSource RnBinds:
A rather gruesome hack to deal with scoping of type variables
from a generic patterns.  Details commented in the ClassDecl
case of RnSource.rnDecl.

Of course, there are many minor renamer consequences of the
other changes above.

* lib/std/PrelBase.lhs
Data type declarations for Unit, :+:, :*:

Slightly unrelated housekeeping
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* hsSyn/HsDecls:
ClassDecls now carry the Names for their implied declarations
(superclass selectors, tycon, etc) in a list, rather than
laid out one by one.  This simplifies code between the parser
and the type checker.

* prelude/PrelNames, TysWiredIn:
All the RdrNames are now together in PrelNames.

* utils/ListSetOps:
Add finite mappings based on equality and association lists (Assoc a b)
Move stuff from List.lhs that is related```
11. 28 Sep, 2000 1 commit
• [project @ 2000-09-28 13:04:14 by simonpj] · 861e836e
simonpj authored
```------------------------------------
Mainly PredTypes (28 Sept 00)
------------------------------------

Three things in this commit:

1.  Main thing: tidy up PredTypes
2.  Move all Keys into PrelNames
3.  Check for unboxed tuples in function args

1. Tidy up PredTypes
~~~~~~~~~~~~~~~~~~~~
The main thing in this commit is to modify the representation of Types
so that they are a (much) better for the qualified-type world.  This
should simplify Jeff's life as he proceeds with implicit parameters
and functional dependencies.  In particular, PredType, introduced by
Jeff, is now blessed and dignified with a place in TypeRep.lhs:

data PredType  = Class  Class [Type]
| IParam Name  Type

Consider these examples:
f :: (Eq a) => a -> Int
g :: (?x :: Int -> Int) => a -> Int
h :: (r\l) => {r} => {l::Int | r}

Here the "Eq a" and "?x :: Int -> Int" and "r\l" are all called
*predicates*, and are represented by a PredType.  (We don't support
TREX records yet, but the setup is designed to expand to allow them.)

In addition, Type gains an extra constructor:

data Type = .... | PredTy PredType

so that PredType is injected directly into Type.  So the type
p => t
is represented by
PredType p `FunTy` t

I have deleted the hackish IPNote stuff; predicates are dealt with entirely
through PredTys, not through NoteTy at all.

2.  Move Keys into PrelNames
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This is just a housekeeping operation. I've moved all the pre-assigned Uniques
(aka Keys) from Unique.lhs into PrelNames.lhs.  I've also moved knowKeyRdrNames
from PrelInfo down into PrelNames.  This localises in PrelNames lots of stuff
now only one.

3.  Unboxed tuples
~~~~~~~~~~~~~~~~~~
Add a static check for unboxed tuple arguments.  E.g.
data T = T (# Int, Int #)
is illegal```
12. 25 Sep, 2000 1 commit
13. 22 Sep, 2000 1 commit
• [project @ 2000-09-22 15:56:12 by simonpj] · 1bba522f
simonpj authored
```--------------------------------------------------
Tidying up HsLit, and making it possible to define

Simon PJ 22 Sept 00
--------------------------------------------------

** NOTE: I did these changes on the aeroplane.  They should compile,
and the Prelude still compiles OK, but it's entirely
possible that I've broken something

The original reason for this many-file but rather shallow
numeric library.  Why?  Because when you say '1' you get
(Prelude.fromInteger 1), regardless of what you hide from the
Prelude, or import from other libraries you have written.  So the
idea is to extend the -fno-implicit-prelude flag so that
in addition to no importing the Prelude, you can rebind
fromInteger	-- Applied to literal constants
fromRational	-- Ditto
negate		-- Invoked by the syntax (-x)
the (-) used when desugaring n+k patterns

After toying with other designs, I eventually settled on a simple,
crude one: rather than adding a new flag, I just extended the
semantics of -fno-implicit-prelude so that uses of fromInteger,
fromRational and negate are all bound to "whatever is in scope"
rather than "the fixed Prelude functions".  So if you say

{-# OPTIONS -fno-implicit-prelude #-}
module M where
import MyPrelude( fromInteger )

x = 3

the literal 3 will use whatever (unqualified) "fromInteger" is in scope,
in this case the one gotten from MyPrelude.

On the way, though, I studied how HsLit worked, and did a substantial tidy
up, deleting quite a lot of code along the way.  In particular.

* HsBasic.lhs is renamed HsLit.lhs.  It defines the HsLit type.

* There are now two HsLit types, both defined in HsLit.
HsLit for non-overloaded literals (like 'x')
HsOverLit for overloaded literals (like 1 and 2.3)

* HsOverLit completely replaces Inst.OverloadedLit, which disappears.
An HsExpr can now be an HsOverLit as well as an HsLit.

* HsOverLit carries the Name of the fromInteger/fromRational operation,
so that the renamer can help with looking up the unqualified name
when -fno-implicit-prelude is on.  Ditto the HsExpr for negation.
It's all very tidy now.

* RdrHsSyn contains the stuff that handles -fno-implicit-prelude
(see esp RdrHsSyn.prelQual).  RdrHsSyn also contains all the "smart constructors"
used by the parser when building HsSyn.  See for example RdrHsSyn.mkNegApp
(previously the renamer (!) did the business of turning (- 3#) into -3#).

* I tidied up the handling of "special ids" in the parser.  There's much
less duplication now.

* Move Sven's Horner stuff to the desugarer, where it belongs.
There's now a nice function DsUtils.mkIntegerLit which brings together
related code from no fewer than three separate places into one single
place.  Nice!

* A nice tidy-up in MatchLit.partitionEqnsByLit became possible.

* Desugaring of HsLits is now much tidier (DsExpr.dsLit)

* Some stuff to do with RdrNames is moved from ParseUtil.lhs to RdrHsSyn.lhs,
which is where it really belongs.

* I also removed
many unnecessary imports from modules
quite a bit of dead code
in divers places```
14. 14 Sep, 2000 1 commit
• [project @ 2000-09-14 13:46:39 by simonpj] · cae34044
simonpj authored
```---------------------------------------
Simon's tuning changes: early Sept 2000
---------------------------------------

Library changes
~~~~~~~~~~~~~~~
* Eta expand PrelShow.showLitChar.  It's impossible to compile this well,
and it makes a big difference to some programs (e.g. gen_regexps)

* Make PrelList.concat into a good producer (in the foldr/build sense)

Flag changes
~~~~~~~~~~~~
* Add -ddump-hi-diffs to print out changes in interface files.  Useful
when watching what the compiler is doing

* Add -funfolding-update-in-place to enable the experimental optimisation
that makes the inliner a bit keener to inline if it's in the RHS of
a thunk that might be updated in place.  Sometimes this is a bad idea
(one example is in spectral/sphere; see notes in nofib/Simon-nofib-notes)

Tuning things
~~~~~~~~~~~~~
* Fix a bug in SetLevels.lvlMFE.  (change ctxt_lvl to dest_level)
I don't think this has any performance effect, but it saves making
a redundant let-binding that is later eliminated.

* Desugar.dsProgram and DsForeign
Glom together all the bindings into a single Rec.  Previously the
bindings generated by 'foreign' declarations were not glommed together, but
this led to an infelicity (i.e. poorer code than necessary) in the modules
that actually declare Float and Double (explained a bit more in Desugar.dsProgram)

* OccurAnal.shortMeOut and IdInfo.shortableIdInfo
Don't do the occurrence analyser's shorting out stuff for things which
This is deeply boring, and mainly to do with making rules work well.
Maybe rules should have phases attached too....

Be a bit more willing to add CPR information to thunks;
in particular, if the strictness analyser has just discovered that this
is a strict let, then the let-to-case transform will happen, and CPR is fine.
modInt = \ x -> let r = ... -> I# v in
...body strict in r...
r's RHS isn't a value yet; but modInt returns r in various branches, so
if r doesn't have the CPR property then neither does modInt

* MkId.mkDataConWrapId
Arrange that vanilla constructors, like (:) and I#, get unfoldings that are
just a simple variable \$w:, \$wI#.  This ensures they'll be inlined even into
rules etc, which makes matching a bit more reliable.  The downside is that in
situations like (map (:) xs), we'll end up with (map (\y ys. \$w: y ys) xs.
Which is tiresome but it doesn't happen much.

* SaAbsInt.findStrictness
Deal with the case where a thing with no arguments is bottom.  This is Good.
E.g.   module M where { foo = error "help" }
Suppose we have in another module
case M.foo of ...
Then we'd like to do the case-of-error transform, without inlining foo.

Tidying up things
~~~~~~~~~~~~~~~~~
* Reorganised Simplify.completeBinding (again).

* Removed the is_bot field in CoreUnfolding (is_cheap is true if is_bot is!)
This is just a tidy up

* HsDecls and others
Remove the NewCon constructor from ConDecl.  It just added code, and nothing else.
And it led to a bug in MkIface, which though that a newtype decl was always changing!

* IdInfo and many others
Remove all vestiges of UpdateInfo (hasn't been used for years)```
15. 18 Aug, 2000 2 commits
16. 16 Aug, 2000 1 commit
• [project @ 2000-08-16 13:28:25 by simonmar] · 66644baa
simonmar authored
```Don't just pick the back edges ({-# SOURCE #-} imports) when
collecting the list of imports for module initialisation.  It's
entirely possible that a module is only reachable from Main via {-#
SOURCE #-} imports.```
17. 10 Aug, 2000 1 commit