Writing a simple Core evaluator, having trouble with name lookups
Csaba Hruska
csaba.hruska at gmail.com
Fri Nov 30 11:46:37 UTC 2018
Just to clarify, for exported names ignore the unique value completely and
use module name + occurrence name. In your case that is the idStableName
field.
For non exported names use idStableName + idUnique.
I'll also check your project.
Cheers,
Csaba
On Fri, Nov 30, 2018 at 12:23 PM Christopher Done <chrisdone at gmail.com>
wrote:
> Hi Csaba,
>
> Thanks for your answer. I think I'm doing something very similar to
> you. I'm converting the GHC AST to my own AST with this code:
>
>
> https://gist.github.com/chrisdone/96e228f12bdbc3c43d06718467e69029#file-main-hs-L815--L915
>
> I have an Id type that's similar to yours,
>
> data Id = Id
> { idStableName :: {-# UNPACK #-}!ByteString
> , idUnique :: {-# UNPACK #-}!Unique
> , idCategory :: !Cat
> } deriving (Generic, Data, Typeable, Eq, Show, Ord)
>
> And (I think) I've solved my first question by adding that category
> field, which can be one of:
>
> data Cat
> = ValCat
> | DataCat
> | ClassCat
> deriving (Generic, Data, Typeable, Eq, Show, Ord)
>
> When an expression like this comes along:
>
> AppE
> (AppE
> (VarE
> (Id
> { idStableName = "main:Main.C:Wiggle"
> , idUnique = Unique 8214565720323785205
> , idCategory = ClassCat
> }))
> (TypE (Typ "Int")))
> (VarE
> (Id
> { idStableName = "main:Main.$cfoo"
> , idUnique = Unique 6989586621679010971
> , idCategory = ValCat
> }))
> VarE
> (Id
> { idStableName = "main:Main.$cbar"
> , idUnique = Unique 6989586621679010975
> , idCategory = ValCat
> })
>
> It constructs a class dictionary for the class "Wiggle", with the
> methods "foo" and "bar", and the interpreter treats Wiggle as a regular
> data constructor. Meanwhile, when an nth class method (like
> "main:Main.$cfoo") is resolved, it produces a Method, and when applying
> a method to a data constructor Wiggle, the interpreter access the nth
> slot.
>
> That works out. An example is here:
>
> https://gist.github.com/chrisdone/771292425a9f1bb428ef4eda3779dc40
>
> See how the "main:Main.$fWiggleInt" is resolved to the above dictionary.
>
> As for the second question, and your answer, I am a bit puzzled, maybe
> you can clarify?
>
> > Regarding the names you can use qualified (module + occ) names for
> > exported ids. (see: Var.isExportedId).
> >
> > For non exported Id's you can rely on unique values.
>
> You say that for exported names I can rely soley on the stable name
> (package+module+ident), and for internal IDs I can use the Unique?
>
> I believe that's what I'm reproducing, here. The following name isn't
> resolved:
>
> Id
> { idStableName = "base:GHC.Base.$fApplicativeIO"
> , idUnique = Unique 8214565720323784738
> , idCategory = ValCat
> }
>
> If I list all bindings available, I find this name, which has a
> different Unique:
>
> Id
> { idStableName = "base:GHC.Base.$fApplicativeIO"
> , idUnique = Unique 8214565720323793553 <--- differing
> , idCategory = ValCat
> }
>
> So if I were to apply your approach and do exported lookups by
> idStableName, and local-module lookups (beta substitution) by Unique, it
> should work out.
>
> The question is whether "base:GHC.Base.$fApplicativeIO" is actually
> exported -- I presume all instance dictionaries are exported.
>
> I will give it a try and report back to you!
>
> Cheers!
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20181130/e93e51a6/attachment.html>
More information about the ghc-devs
mailing list