2017-04-04 5 views
0

generieren In der Frames library hat man eine readTable Funktion, die einen Datensatztyp basierend auf einer CSV-Datei generiert.FFI-Aufruf mit Vorlage Haskell

Ist es möglich, einen Anruf wie foreign import ccall unsafe "// c code" c_foo :: Int -> IO() zu generieren?

Ich habe versucht, so mit einem [d| ... |] und einem [t| ... |] Quasiquoters zu erreichen, aber in beiden bekomme ich einen Parser-Fehler.

+5

Es ist möglich. '[d | der fremde Import ccall unsafe "malloc" c_malloc :: Int -> IO() |] 'zum Beispiel funktioniert. Es gibt einige Beispiele für Vorlage Haskell mit FFI [hier] (https://wiki.haskell.org/Foreign_Function_Interface#Inline_FFI_calls). Beachten Sie auch, dass dies genau das ist, was [inline-c] (https://hackage.haskell.org/package/inline-c) und [inline-java] (https://hackage.haskell.org/package/inline- Java) verlassen sich auf. – Alec

+0

@Alec könnten Sie dies eine Antwort machen, damit ich es akzeptieren kann? :) –

Antwort

1

Ja, es ist möglich. Die Fehlermeldung, die Sie sehen, ist aufgrund "// c code" eine "Malformed Entitätszeichenfolge". Alles, was mehr gesund, und Sie sind aus dem Rennen:

ghci> :set -XTemplateHaskell 
ghci> ffi = [d| foreign import ccall unsafe "foo" c_foo :: Int -> IO() |] 

Here ein Beispiel ist die so ziemlich genau das tut, was Sie fragen. Beachten Sie, dass beide Pakete inline-c und inline-java auf diese Art von Sache verlassen.

+0

"// c code" war nur ein Platzhalter, den ich hier geschrieben habe, wie auch immer, danke für die Antwort, es hat mir wirklich geholfen :) –

Verwandte Themen