[haskell-llvm] Beginner - Anonymous Functions

Henning Thielemann lemming at henning-thielemann.de
Fri Nov 18 15:02:18 GMT 2011


Elliott Pace wrote:
> Thanks again for the help. I realised I was perhaps rushing things too 
> much when I couldn't really think out the types.

I have still no idea, what you actually want to achieve in the end.

> A problem I'm having is that pointers seem to be well-typed, which 
> causes problems with my current representation of a function value. 
> What's the correct method of dealing with this?

You can cast pointers to and from Ptr (). But before you resort to this 
you should check for a type-safe solution.

> So, my function value is: A pointer to a pair of pointers, one to a 
> function and one to a linked list of arguments. Therefore I would have 
> something like
> 
> type FunctionValue f = Ptr (Ptr f)
> -- type FunctionValue[4] f = Ptr (LLNode a)

What do you mean with this comment?

> Now, trying to code my "call'" function, that given a pointer to a 
> function value and an argument, calls our function with argument and 
> linked list as needed:
> 
> call' :: Value (FunctionValue (LLNode a -> b -> IO c)) -> b -> 
> CodeGenFunction r c
> call' fValue x = do
>     f <- load fValue
>    
>     listPtr <- getElementPtr fValue (1 :: Word32, ())
>     let _ = listPtr :: Value (Ptr (LLNode a))
> 
>     llNode <- load listPtr
> 
>     call f llNode x
> 
> This causes problems (amongst others present, but babysteps!).

What problems does it cause?

I think it would work to put a sequence of function pointers into an 
array and traverse this array using
    nextFuncPtr <- getElementPtr currentFuncPtr (1 :: Word32, ())

The type of a linked list is recursive and it is difficult to define in 
Haskell, such that it can be translated to LLVM. In this case it might 
be the simplest way to use Ptr () for the link to the next node, and to 
cast it to the list node type whenever you read it.


-- 
Mit freundlichen Gruessen
Henning Thielemann

Viele Gruesse
Henning

Martin-Luther-Universitaet Halle-Wittenberg, Institut fuer Informatik

Tel. +49 - 345 - 55 24773
Fax  +49 - 345 - 55 27333



More information about the Haskell-llvm mailing list