It's possible to have multiple compile time phases (as evidenced by the possibility of multiple splices). Metaocaml supports k phases so we should as well!
Fwiw, It is also possible to implement run-time code generation, see https://github.com/mainland/th-new http://johnlato.blogspot.com/2012/10/runtime-meta-programming-in-haskell.html On Fri, Jan 25, 2019 at 12:49 PM Simon Peyton Jones <[email protected]> wrote: > > Interesting. I don’t recall a specific reason why nested brackets were > outlawed. I think it was just that we didn't think we needed them, so it > seemed simplest not to have them. TH does not do runtime codegen, so there > are really only two stages: compile time and run time. > > Do you have a compelling use-case? > > Simon > > | -----Original Message----- > | From: ghc-devs <[email protected]> On Behalf Of Matthew > | Pickering > | Sent: 25 January 2019 11:57 > | To: Richard Eisenberg <[email protected]> > | Cc: GHC developers <[email protected]> > | Subject: Re: Why are nested brackets disallowed? > | > | I don't think that cross stage persistence will work as it is currently > | implemented which is probably why the check exists. > | > | 1. The normal case > | > | foo x = [| x |] ===> > | foo x = [| $(lift x) |] > | > | 2. x is defined at stage 0, and used at stage 2. > | > | One option is: > | foo x = [| [| x |] |] ===> > | foo x = [| [| $($(lift (lift x))) |] |] or foo x = [| [| x |] |] ===> > | foo x = [| let x' = $(lift x) in [| $(lift [| x' |]) |] > | > | We need to think a bit how to `lift` something of type `Q Exp` because of > | the `Q` monad. Lifting an `Exp` seems trivial as it's a normal ADT (I > | tested and this works after deriving 40 instances). > | > | You can define `lift2` which lifts an expression twice as follows. > | > | ``` > | lift2 :: Lift a => a -> Q Exp > | lift2 a = lift a >>= \e -> [| return $ $(lift e) |] ``` > | > | 3. x is defined at stage 1 and used in stage 2 > | > | foo = [| \x -> [| x |] |] ===> > | foo = [| \x -> [| $(lift x) |] |] > | > | Desugared with a single call to `lift` like normal. > | > | 4. x is defined in stage 2 and used in stage 1 > | > | foo = [| [| \x -> $(x) |] |] > | > | Rejected just like usual. `x` won't be bound when the splice is run. > | > | It seems that with some suitable care that things will work out when > | lifting across multiple levels but that is the point where care needs to > | be taken. > | > | Matt > | > | > | > | On Thu, Jan 24, 2019 at 5:46 PM Richard Eisenberg <[email protected]> > | wrote: > | > > | > I think Geoff was primarily concerned with typed Template Haskell, not > | the untyped variety. > | > > | > I, too, have wondered if there was a technical reason behind this > | restriction, or if merely it was assumed that nested brackets were not > | worthwhile. > | > > | > One question: how would staging work between nesting levels of > | brackets? > | > > | > Richard > | > > | > > On Jan 24, 2019, at 12:42 PM, Ben Gamari <[email protected]> > | wrote: > | > > > | > > Matthew Pickering <[email protected]> writes: > | > > > | > >> There is a check in `RnSplice` which errors on the following > | > >> program with nested brackets. > | > >> > | > > It might be good to explicitly include Geoff Mainland in this thread. > | > > I'm not sure he'll see it otherwise. > | > > > | > > Cheers, > | > > > | > > - Ben > | > > > | > > _______________________________________________ > | > > ghc-devs mailing list > | > > [email protected] > | > > https://nam06.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmai > | > > l.haskell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fghc-devs&data=02% > | > > 7C01%7Csimonpj%40microsoft.com%7Cdf0aa539bb1041dca42308d682bc3d4b%7C > | > > 72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636840142327169830&sd > | > > ata=oIiA768uqGGGBJh7ogpymmPvuKBDLj%2BiqJCZpig6SPg%3D&reserved=0 > | > > | _______________________________________________ > | ghc-devs mailing list > | [email protected] > | https://nam06.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmail.has > | kell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fghc- > | devs&data=02%7C01%7Csimonpj%40microsoft.com%7Cdf0aa539bb1041dca42308d > | 682bc3d4b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636840142327169830 > | &sdata=oIiA768uqGGGBJh7ogpymmPvuKBDLj%2BiqJCZpig6SPg%3D&reserved= > | 0 _______________________________________________ ghc-devs mailing list [email protected] http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
