OK good. I got it built. Then I compiled
data D = D
with -XGenerics -ddump-deriv -dppr-debug
The "-dppr-debug" flag makes the uniques show up.
Then you can see that the two from0 occurrences have different uniques, hence
the error.
The problem was that you'd assigned a unique to fromOName, namely
from0ClassOpKey, but you hadn't added from0 to the list of basicKnownKeyNames
in PrelNames.
Have a look here
http://hackage.haskell.org/trac/ghc/wiki/Commentary/Compiler/WiredIn
In fact you don't need to give a Key to from0. Instead, just use a qualifed
RdrName Generics.from0. You want an "Orig" RdrName (see
http://hackage.haskell.org/trac/ghc/wiki/Commentary/Compiler/RdrNameType). You
build one of those with varQual_RDR; there are lots of other examples in
PrelNames.
I've made a patch and have pushed it, so you can just pull.
I have started a wiki page in the Commentary
http://hackage.haskell.org/trac/ghc/wiki/Commentary/Compiler/GenericDeriving
Can you fill in brief details, summarising where the main code lives? Details
belong in the code itself; this overview is just to orient someone, and to help
us to work together. Eg you can record open problems, or to-do lists.
Simon
From: José Pedro Magalhães [mailto:[email protected]]
Sent: 27 October 2010 13:39
To: Simon Peyton-Jones
Cc: [email protected]
Subject: Re: Generic deriving in GHC
Ok, I think I now succeeded in pushing my patches to
darcs.haskell.org<http://darcs.haskell.org>, along with all the patches pushed
so far to the repos we've cloned (ghc, ghc-prim and base).
Cheers,
Pedro
2010/10/25 José Pedro Magalhães <[email protected]<mailto:[email protected]>>
Hi,
Currently I have all the generics stuff in GHC.Generics in ghc-prim, but I
removed its export from GHC.Base, so no name clashes occur anymore.
For my implementation I'm mostly following what's already there for the current
generics stuff. So, previously, types/Generics.lhs took care of generating the
binders for generic representations. I'm currently generating the
representations there, but I don't want them to be just binders: I want them to
be instances.
Previously, a type data D = D triggered the generation of binders
$gfromD = ...
$gtoD = ...
Now, what I actually want is to generate an instance of the form
instance Representable0 D where
type instance Rep D = ...
from0 D = ...
to0 (...) = D
(Whether the final implementation will use associated types or MPTCs is still
open for debate.) The stuff generated in types/Generics.lhs is used in
typecheck/TcDeriv.lhs. Previously, things like $gfromD were just returned as
extra top-level bindings, together with generated instance declarations. Now,
we no longer need top-level bindings (I think), but we do need to return extra
instances. These are the representable instances, and will be generated even if
there are no deriving clauses in the program. (When there are deriving clauses
for generic classes, I think this is where a generic instance will be added
too, but I'm not at that stage yet.)
So far so good, and I managed to add some form of Representable0 instances
(function genGenericRepBinds in TcDeriv.lhs). Problem is, when compiling a file
with -XGenerics (to enable the generation of generic representations), I still
get complaints of lacking "explicit or default" methods, even though those are
generated:
==================== Derived instances ====================
InstInfo: GHC.Generics.Representable0
Main.A
(GHC.Generics.D1
GHC.Generics.NoSelector
(GHC.Generics.C1 GHC.Generics.NoSelector GHC.Generics.V1)
t_a)
{ GHC.Generics.from0 _
= GHC.Generics.M1
(GHC.Err.error
"No generic representation for empty datatype Main.A")
GHC.Generics.to0 (GHC.Generics.M1 _)
= GHC.Err.error "No values for empty datatype Main.A" }
test/Main.hs:1:1:
Warning: No explicit method nor default method for `GHC.Generics.from0'
In the instance declaration for `GHC.Generics.Representable0
A
(GHC.Generics.D1
GHC.Generics.NoSelector
(GHC.Generics.C1
GHC.Generics.NoSelector GHC.Generics.V1)
t_a)'
test/Main.hs:1:1:
Warning: No explicit method nor default method for `GHC.Generics.to0'
In the instance declaration for `GHC.Generics.Representable0
A
(GHC.Generics.D1
GHC.Generics.NoSelector
(GHC.Generics.C1
GHC.Generics.NoSelector GHC.Generics.V1)
t_a)'
Also, if I have more than one datatype, I start getting
/tmp/ghc28844_0/ghc28844_0.s: Assembler messages:
/tmp/ghc28844_0/ghc28844_0.s:405:0:
Error: symbol `ghczmprim_GHCziGenerics_Representable0_closure' is already
defined
So I'm clearly doing something wrong when generating my Representable0
instances...
Also, for the meta-information I will need to generate (empty) datatypes, which
should not be visible for the user. How can I do this? Currently I see how to
generate bindings for values and functions, but now how to declare new types.
Would TcDeriv.lhs be the appropriate place for this? Note that these auxiliary
types do not need generic representations.
I do not have an account on darcs.haskell.org<http://darcs.haskell.org> yet, so
I'm attaching the patches with the changes I've done so far.
Thanks,
Pedro
_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc