husk-scheme-3.15: R5RS Scheme interpreter, compiler, and library.

Portabilityportable
Stabilityexperimental
Maintainergithub.com/justinethier
Safe HaskellNone

Language.Scheme.Compiler

Description

This module contains a Scheme to Haskell compiler which performs the following transformations:

 Scheme AST (LispVal) => Haskell AST (HaskAST) => Compiled Code (String)

The GHC compiler is then used to create a native executable. At present, the focus has just been on creating a compiler that will generate correct, working code. Many optimizations could and need to be made for time and space...

Note the following type is used for all functions generated by the compiler:

 compiledFunc :: 
   Env ->                  -- Runtime Environment
   LispVal ->              -- Continuation
   LispVal ->              -- Value
   Maybe [LispVal] ->      -- Additional arguments
   IOThrowsError LispVal   -- Result

Synopsis

Documentation

compile :: Env -> LispVal -> CompOpts -> IOThrowsError [HaskAST]Source

Compile a Lisp expression to Haskell. Note this function does not expand macros; mcompile should be used instead if macros may appear in the expression.

compileApply :: Env -> LispVal -> CompOpts -> IOThrowsError [HaskAST]Source

Compile a function call

compileBlock :: String -> Maybe String -> Env -> [HaskAST] -> [LispVal] -> IOThrowsError [HaskAST]Source

Compile a list (block) of Scheme code

compileDivertedVars :: String -> Env -> [LispVal] -> CompOpts -> IOThrowsError HaskASTSource

Take a list of variables diverted into env at compile time, and divert them into the env at runtime

compileExpr :: Env -> LispVal -> String -> Maybe String -> IOThrowsError [HaskAST]Source

Compile an intermediate expression (such as an arg to if) and call into the next continuation with it's value

compileLambdaList :: [LispVal] -> IOThrowsError StringSource

Compile the list of arguments for a function

compileLispSource

Arguments

:: Env

Compiler environment

-> String

Filename

-> String

Function entry point (code calls into this function)

-> Maybe String

Function exit point, if any

-> IOThrowsError [HaskAST] 

Compile a file containing scheme code

compileScalar :: String -> CompOpts -> IOThrowsError [HaskAST]Source

Helper function to compile expressions consisting of a scalar

compileSpecialForm :: String -> String -> CompOpts -> IOThrowsError HaskASTSource

Helper function for compiling a special form

compileSpecialFormBody :: Env -> LispVal -> CompOpts -> (Maybe String -> ErrorT LispError IO [HaskAST]) -> ErrorT LispError IO [HaskAST]Source

A wrapper for each special form that allows the form variable (EG: if) to be redefined at compile time

compileSpecialFormEntryPoint :: String -> String -> CompOpts -> IOThrowsError HaskASTSource

Create the function entry point for a special form

defineLambdaVars :: Env -> [LispVal] -> IOThrowsError LispValSource

Add lambda variables to the compiler's environment

defineTopLevelVars :: Env -> [LispVal] -> IOThrowsError LispValSource

Find all variables defined at this level and load their symbols into the environment. This allows the compiler validation to work even though a variable is used in a sub-form before it is defined further on down in the program

divertVarsSource

Arguments

:: Env

Current compile Environment

-> LispVal

Lisp code after macro expansion

-> CompOpts

Compiler options

-> (Env -> LispVal -> CompOpts -> IOThrowsError [HaskAST])

Continuation to call into after vars are diverted

-> IOThrowsError [HaskAST]

Code generated by the continuation, along with the code added to divert vars to the compiled program

Do the actual insertion of diverted variables back to the compiled program.

initializeCompiler :: Env -> IOThrowsError [HaskAST]Source

Perform one-time initialization of the compiler's environment

isPrim :: Env -> LispVal -> IOThrowsError (Maybe LispVal)Source

Determines if the given lispval is a primitive function

mcompile :: Env -> LispVal -> CompOpts -> IOThrowsError [HaskAST]Source

Expand macros and compile the resulting code

mfunc :: Env -> LispVal -> (Env -> LispVal -> CompOpts -> IOThrowsError [HaskAST]) -> CompOpts -> IOThrowsError [HaskAST]Source

Expand macros and then pass control to the given function