Visual Basic for Applications (VBA) backend for Idris
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Idris VBA back end

Based on Edwin Brady's PHP backend.

Generates .bas files which can be imported in to Microsoft Excel as a module.

Does this really work?

Yes! But it is not a complete backend by any means, there are many situations which will not work just yet.

Interesting Features

  • Unsigned numbers
  • Foreign calls to VBA
  • Foreign calls to C libraries
  • General tail call elimination


See generated code.

module Main

import VBA
import Util


zipIx : Int -> List a -> List (Int, a)
zipIx _ []        = []
zipIx n (x :: xs) = (n, x) :: zipIx (n+1) xs

putResult : (Int, Int, Int, Int) -> VBA ()
putResult (i, x, y, z) = do
  putCell i 1 (show x)
  putCell i 2 (show y)
  putCell i 3 (show z)


pythag : Int -> List (Int, Int, Int)
pythag max = [(x, y, z) | z <- [1..max], y <- [1..z], x <- [1..y],
                          x * x + y * y == z * z ]

main : VBA ()
main = do
  putStrLn "Clearing cells..."

  putStrLn "Writing headers..."
  putCell 1 1 "X"
  putCell 1 2 "Y"
  putCell 1 3 "Z"

  putStrLn "Calculating..."
  mapM_ putResult $ zipIx 2 (pythag 50)


Foreign Function Interface

The Idris VBA backend has full support for accessing both VBA and C foreign functions.

You can bind simple VBA functions using the standard FFI style:

mid : String -> Int -> Int -> VBA String
mid s i l = foreign FFI_VBA "Mid" (String -> Int -> Int -> VBA String) s i l

Or property assignment using the indexed FFI style:

putCell : Int -> Int -> String -> VBA ()
putCell x y str = foreign FFI_VBA "Cells(%0,%1)=%2" (Int -> Int -> String -> VBA ()) x y str

To bind C functions, you need to specify the library which contains the function as well as the function name itself, separated by a /.

htonl : Bits32 -> VBA Bits32
htonl x = foreign FFI_VBA "libc.dylib/htonl" (Bits32 -> VBA Bits32) x