Hello Tim,

I don't know the answers to your questions exactly, but I've played around with something that I think might be related, so I thought I'd share.   The example code is here:

https://github.com/GaloisInc/galua/blob/master/galua-jit/src/Galua/Micro/Compile.hs

This module contains a function that compiles (at runtime) a Haskell module represented as a String to the value of whatever `main` happened to be defined in this module.
Actually, in this case the expression is taken as a `Doc` , which is the result of pretty printing something, but this doc is simply "show"-ed to make a string (see `modText`).

The function works in roughly two steps:
    1. Compile the module:
        1.1. Setup some compiler flags, this has to do with the dependencies of the module (i.e., what packages it depends on, etc)
        1.2. Define a "target":  this is what GHC will be compiling.  There is a bit of weirdness here:  GHC can take the input to compile either from a text file, or from an in-memory buffer.  The second is what we want here.  Unfortunately, for some reason GHC still insists on there being a file around (its contents is completely irrelevant) I think it just want to check when it was last modified :-)    This is why we create an empty file.     This is something that should probably be fixed in GHC.
        1.3 Load all the targets:  this is what will actually compile the module
    2. Get the value of `main` in this module:  this is done in the `Succeed` branch of the case, where we create an expression `M.main` and tell GHC to evaluate it.

Depending on how you need things to be setup, just the second step might be enough (i.e., call `compileExpr`).   You'd still need to do enough to tell GHC in what context it will be compiling the expression though.

I am not an expert on this topic, but I'd be happy to try to answer more questions if I can.

-Iavor



On Fri, Nov 17, 2017 at 10:42 AM Matthew Pickering <matthewtpickering@gmail.com> wrote:
Hi Tim,

When you say "multi-stage programming language" do you have a specific
calculus in mind? I think this can mean lots of different things to
different people.

This is a topic I have been interested in recently.

Cheers,

Matt

On Fri, Nov 17, 2017 at 6:05 PM, Tim Sheard <sheard@pdx.edu> wrote:
> After many years of hoping someone else would do this, I would like to
> make GHC into a true multi-stage programming language. Here is how I
> thought I might approach this.
>
> 1) Use the GHC as a library module.
> 2) Use the LLVM backend.
>
> I have no experience with either of these tools.
> Lets start simple, How would I write functions like
>
> compile :: String -> IO PtrToLLVMCode  -- where the string is a small
> Haskell program.
> llvmCompile :: PtrToLLVMCode -> IO PtrToMachineCode
> jumpTo:: PtrToMachineCode -> IO ans   -- where ans is the "type" of the
> string.
>
>
> Any thoughts on how to get started? What papers to read, examples to look
> at?
>
> I'd love to move to some more disciplined input type, a sort of (mono) typed
> program
> representation (with similar complexity) to Template Haskell Exp type.
>
> where (Exp t) is a data structure representing a Haskell program of type t.
>
> All offers of advice accepted. I'm trying to get started soon, and good
> advice
> about what to avoid is especially welcome.  If any one wanted to help with
> this,
> that would be great.
>
> Tim Sheard
>
> _______________________________________________
> ghc-devs mailing list
> ghc-devs@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs