nix-eval: Evaluate Haskell expressions using Nix to get packages

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.


Evaluate Haskell expressions using Nix to get packages

[Skip to ReadMe]


Change logNone available
Dependenciesbase (==4.8.*), process [details]
AuthorChris Warburton
Home page
UploadedWed Sep 30 12:03:18 UTC 2015 by chriswarbo




Maintainers' corner

For package maintainers and hackage trustees

Readme for nix-eval-

[back to package description]

Dependency-Injecting Eval for Haskell

This Haskell package is a crude implementation of eval, as found in dynamic languages like Lisp, Python, Javascript, etc. It lets us construct Haskell code programatically (either at run time, or in Template Haskell), and attempt to evaluate it.

What sets this package apart from other eval implementations, is the ability to control which packages and modules are available during evaluation. This is achieved by calling out to the Nix package manager.

Implementation Details

Expr is the type of expressions, which contains a list of package names, a list of modules to import and a String of Haskell code. All of these are just Strings internally, but the wrappers prevent accidentally using package as modules, etc. A few combinators are provided for common manipulations, and the OverloadedStrings extension allows packages, modules and expressions to be written as literals. Note that literal expressions are given an empty context; you will have to specify any required modules or packages separately.

When evaluated, the Haskell code is prefixed by an import of each module and wrapped in main = putStr (..), then piped into runhaskell. That process is invoked via the nix-shell command, using Nix's standard haskellPackages.ghcWithPackages function to ensure the GHC instance has all of the given packages available.

If the process exits successfully, its stdout will be returned wrapped in Just; otherwise Nothing is returned.

This implementation is a little rough; for example, you may prefer to use Text rather than String; use a better representation like the syntax trees from TemplateHaskell or haskell-src-exts instead; or accumulate packages and modules monadically.

The intention of this library is to provide a simple, minimal base to support such design choices, and String is the lowest common denominator. You're welcome, and encouraged, to build more sophisticated APIs; as long as you can pretty-print to a String, they should work out of the box.

This is also why we return the contents of stdout, rather than trying to parse it into a more appropriate type: it's not our place to choose how the result should be parsed, so we avoid the problem; by that point, our job is done.