newspecies [12:16 PM]
-- | Adds import declarations to a module for an implicit Prim import and Prim
-- | qualified as Prim, as necessary.
importPrim :: Module -> Module
importPrim =
let
primModName = C.Prim
in
addDefaultImport (Qualified (Just primModName) primModName)
. addDefaultImport (Qualified Nothing primModName)
newspecies [12:17 PM]
I am trying to understand purescript compiler and I am not able to understand where Prim module is coming from? Is it not there in the Purescript compiler and gets added when you build the code? Till now I have found this code. Can someone please explain how this works.
lunaris [12:45 PM]
@newspecies Shameless plug – my PR at https://github.com/purescript/purescript/pull/3351 might help with this. I doubt it’s the only one (the newest seems to involve Prim
too) but it shows a few things:
• src/Language/PureScript/Constants.hs
– this module defines a lot of things, but one of them is the names of primitive modules and types. Importantly it exports primModules
, which is a list of Prim
and Prim.*
modules which is used in various parts of the compiler to provide the Prim
modules magically as you describe.
• src/Language/PureScript/Docs/Prim.hs
– this module defines documentation for Prim
and Prim.*
modules, since they don’t have “real” .purs
files to which documentation can be added.
• src/Language/PureScript/Environment.hs
– this module is the meat in many ways; it shows how Prim
modules and their members are added to the environment the compiler uses for type checking, name resolution etc. This environment population is also performed for every “real” module too, there are just some special pre-populations for Prim
stuff.
In the case of my PR, I’m adding a module Prim.Coerce
which exposes a class Coercible
, so the things I’ve described above should relate to those things in a sensible way, hopefully. Hope that helps. (edited)
newspecies [2 days ago]
Will check it out. Thanks for the help