clr-inline

NOTE: you will need GHC >= 8.2 to use this package in Windows.
What is clr-inline
clr-inline provides a quasiquoter to inline F# and C# code in Haskell modules.
It was inspired by [inline-java], [inline-c] and [inline-r], and it is implemented
on top of clr-host and clr-marshal packages.
Example
Graphical hello world using F# Winforms:
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
module Main where
import Clr.Inline
[fsharp|
open System.Windows.Forms
|]
main = do
startClr
let text = "Hello from Haskell"
[fsharp|
let form = new Form(Text=$text:string)
let button = new Button(Text="Click Me!", Dock=DockStyle.Fill)
button.Click.Add(fun _ -> MessageBox.Show($text, "Hey!") |> ignore)
form.Controls.Add(button)
Application.Run(form)
|]
Features
- Inline F# / C# in Haskell.
- Automatic unmarshalling of CLR primitive types into Haskell.
- Reference types support including arrays and generics.
- Refer to (
Quotable) Haskell values inside F# / C# quotations.
- Experimental support for Haskell lambdas in F#.
- See the InlineSpec.hs test module for examples of usage.
- Only mscorlib types are admitted, type resolution will crash at runtime otherwise.
Getting Started
Install the clr-inline package from Hackage using your preferred package manager:
$ cabal install clr-inline
$ stack install clr-inline
By default, .Net is used in Windows and mono in other systems.
This is driven by Cabal flags in the clr-host package.
Requirements
clr-inline requires GHC >=8.0 for mono, and either GHC >=8.2 or a linker preprocessor for .Net.
Cabal requires that the CLR compiler is in the application path at cabal configure time.
The module Clr.Inline.Cabal provides an optional Cabal user hook that can be added to a cabal
Setup script to check for this automatically
Bug #14090 in GHC 8.2.1 requires that the StaticPointers language extension is turned on in every module that
contains an inline F# or C# block. Moreover, the modules must have an unrestricted export list.
The quasiquoters look for the F#/C# compiler binaries in the
application path. External dependencies and additional search paths can be provided to
the quasiquoter as configuration. Configuration creates a new quasiquoter;
since GHC does not allow calling a quasiquoter from the same module where it is
defined, the recommended practice is to configure the quasiquoters in a
dedicated Config module. Example configuration for WPF dependencies:
module WpfDeps where
import Clr.Inline
import Clr.Inline.Config
wpf =
fsharp' $
defaultConfig
{ configDependencies =
[ "System.Xaml"
, "WindowsBase"
, "PresentationCore"
, "PresentationFramework"
]
}
LICENSE
Copyright (c) 2017 Jose Iborra
clr-inline is free software and may be redistributed under the terms
specified in the LICENSE file.