Sets the Context for the current module. This function, if called, must be called before any of the other TH functions in this module. Fails if that's not the case.
Moduleinline-c-0.9.1.10Haskell2010
Language.C.Inline.Internal
- 5 types
- 19 values
- Packageinline-c-0.9.1.10
- Exports24
- LanguageHaskell2010
- LicenceMIT
- SourceInternal.hs
Context handling
2 declarationsGets the current Context. Also makes sure that the current module is initialised.
Substitution
3 declarationsConstructors
Define macros that can be used in the nested Template Haskell expression.
Macros can be used as @MACRO_NAME(input) in inline-c quotes, and will transform their input with the given function.
They can be useful for passing in types when defining Haskell instances for C++ template types.
Given a C type name, return the Haskell type in Template Haskell. The first parameter controls whether function pointers should be mapped as pure or IO functions.
Emitting and invoking C code
0 declarationsThe functions in this section let us access more the C file
associated with the current module. They can be used to build
additional features on top of the basic machinery. All of
inline-c is based upon the functions defined here.
Emitting C code
Simply appends some string to the module's C file. Use with care.
Simply appends some string of block to the module's C file. Use with care.
Inlining C code
We use the Code data structure to represent some C code that we want to emit to the module's C file and immediately generate a foreign call to. For this reason, Code includes both some C definition, and enough information to be able to generate a foreign call -- specifically the name of the function to call and the Haskell type.
All the quasi-quoters work by constructing a Code and calling inlineCode.
Data type representing a list of C definitions with a typed and named entry function.
We use it as a basis to inline and call C code.
Constructors
CodecodeCallSafety :: SafetySafety of the foreign call.
codeLoc :: Maybe LocThe haskell source location used for the #line directive
codeType :: TypeQType of the foreign call.
codeFunName :: StringName of the function to call in the code below.
codeDefs :: StringThe C code.
codeFunPtr :: Bool
Inlines a piece of code inline. The resulting Exp will have the type specified in the codeType.
In practice, this function outputs the C code to the module's C file, and then inserts a foreign call of type codeType calling the provided codeFunName.
Example:
c_add :: Int -> Int -> Int
c_add = $(do
here <- TH.location
inlineCode $ Code
TH.Unsafe -- Call safety
(Just here)
[t| Int -> Int -> Int |] -- Call type
"francescos_add" -- Call name
-- C Code
"int francescos_add(int x, int y) { int z = x + y; return z; }")
inlineExp :: SafetySafety of the foreign call
-> LocThe location to report
-> TypeQType of the foreign call
-> Type CIdentifierReturn type of the C expr
-> [(CIdentifier, Type CIdentifier)]Parameters of the C expr
-> StringThe C expression
-> ExpQ
Same as inlineCItems, but with a single expression.
c_cos :: Double -> Double
c_cos = $(do
here <- TH.location
inlineExp
TH.Unsafe
here
[t| Double -> Double |]
(quickCParser_ "double" parseType)
[("x", quickCParser_ "double" parseType)]
"cos(x)")
inlineItems :: SafetySafety of the foreign call
-> BoolWhether to return as a FunPtr or not
-> Maybe StringOptional postfix for the generated name
-> LocThe location to report
-> TypeQType of the foreign call
-> Type CIdentifierReturn type of the C expr
-> [(CIdentifier, Type CIdentifier)]Parameters of the C expr
-> StringThe C items
-> ExpQ
Same as inlineCode, but accepts a string containing a list of C statements instead instead than a full-blown Code. A function containing the provided statement will be automatically generated.
c_cos :: Double -> Double
c_cos = $(do
here <- TH.location
inlineItems
TH.Unsafe
False
Nothing
here
[t| Double -> Double |]
(quickCParser_ "double" parseType)
[("x", quickCParser_ "double" parseType)]
"return cos(x);")
Parsing
8 declarationsThese functions are used to parse the anti-quotations. They're exposed for testing purposes, you really should not use them.
Constructors
Instances2Eq, Show
Eq ParameterTypeDefined in inline-c-0.9.1.10 · Language.C.Inline.InternalShow ParameterTypeDefined in inline-c-0.9.1.10 · Language.C.Inline.Internal
Constructors
parseTypedC :: CParser HaskellIdentifier m=> Bool-> AntiQuoters-> m ParseTypedCReturns the return type, the captured variables, and the body.
Returns the type and the body separately.
Line directives
3 declarationsTell the C compiler where the next line came from.
Example:
@@
there <- location
f (unlines
[ lineDirective $(here)
, "generated_code_user_did_not_write()"
, lineDirective there
] ++ userCode
])
@@
Use lineDirective $(C.here) when generating code, so that any errors or
warnings report the location of the generating haskell module, rather than
tangentially related user code that doesn't contain the actual problem.
Get the location of the code you're looking at, for use with lineDirective; place before generated code that user did not write.
Utility functions for writing quasiquoters
2 declarationsgenericQuote :: Purity-> (Loc -> TypeQ -> Type CIdentifier -> [(CIdentifier, Type CIdentifier)] -> String -> ExpQ)Function building an Haskell expression, see inlineExp for guidance on the other args.
-> QuasiQuoter