[Yhc] Yhc and plugins architecture

Tom Shackell shackell at cs.york.ac.uk
Mon Sep 18 06:18:52 EDT 2006


On Sun, 2006-09-17 at 18:31 +0200, Cédric Paternotte wrote:
> Hi,
> 
> I was wondering whether Yhc was able to provide dynamic loading of modules.
> 
> Let's say I'd wanted to do something like :
> 
> myFiboFunction <- loadModule "myPlugin.hbc" "myFiboFunction"
> putStrlLn $ myFiboFunction 10
> 
> Is it possible to achieve this in the current state of Yhc ?
> I know there's an API out there to load bytecodes at runtime but I'm
> not sure it's meant to do that...

Hi Cedric, 

There is indeed a RuntimeAPI, though it's still in the process of being
written so it's a bit low level. At somepoint we'll write a
user-friendly library over the top but at present your example would be:

import YHC.Runtime.API

main = do
    let typ = undefined :: Int -> Int
    fibo <- loadFromModule "MyPlugin" "myFiboFunction" typ
    putStrLn $ show $ fibo 10
  
loadFromModule :: String -> String -> a -> IO a
loadFromModule mod obj typ = do
    pluginModule <- moduleLoad mod
    case pluginModule of 
       Nothing -> error $ "couldn't load module '"++mod++"'"
       Just m -> do
         fiboNode <- moduleLookupNode m obj
	 case fiboNode of 
           Nothing -> error $ "could not find '"++obj++
                              "' in module '"++mod++"'"
           Just n -> do
             typRep <- getType typ
	     withNode n typRep $ \ fibo -> 
              return fibo

Notice that it's necessary to give a dummy parameter of the correct type
to keep the type system happy. Also be wary that the system currently
doesn't check that the type is correct so doing:

   ...
   let typ = undefined :: Float -> Char
   ..

Will compile and even execute, but will prompty crash horribly. In
future we'll add type checking so it'll give a sensible runtime error.
  
Hope that helps :-)


Tom



More information about the Yhc mailing list