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

Portabilityportable
Stabilityexperimental
Maintainergithub.com/justinethier
Safe HaskellSafe-Inferred

Language.Scheme.Compiler

Description

This module contains an experimental Scheme to Haskell compiler.

The compiler 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...

Synopsis

Documentation

data CompOpts Source

A type to store options passed to compile eventually all of this might be able to be integrated into a Compile monad

createAstFuncSource

Arguments

:: CompOpts

Compilation options

-> [HaskAST]

Body of the function

-> HaskAST

Complete function code

Create code for a function

createAstContSource

Arguments

:: CompOpts

Compilation options

-> String

Value to send to the continuation

-> String

Extra leading indentation (or blank string if none)

-> HaskAST

Generated code

Create code for a continutation

data HaskAST Source

A very basic type to store a Haskell AST. FUTURE: is this even necessary? Would just a string be good enough?

Instances

joinLSource

Arguments

:: forall a .  
=> [[a]]

Original list-of-lists

-> [a]

Separator

-> [a]

Joined list

A utility function to join list members together

ast2Str :: LispVal -> StringSource

Convert abstract syntax tree to a string

asts2Str :: [LispVal] -> StringSource

Convert a list of abstract syntax trees to a list of strings

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

Add lambda variables to the compiler's environment

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.

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

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

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

Compile a function call

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

Determines if the given lispval is a primitive function

_collectLiterals :: [LispVal] -> [LispVal] -> Bool -> Maybe [LispVal]Source

Determine if the given list of expressions contains only literal identifiers EG: 1, 2, etc. And return them if that is all that is found.

Atoms are a special case since they denote variables that will only be available at runtime, so a flag is used to selectively include them.