39 lines
904 B
Elixir
39 lines
904 B
Elixir
defmodule FFI.Library do
|
|
defmacro __using__([name: name]) do
|
|
quote do
|
|
import FFI.Library
|
|
|
|
def ffi_lib, do: unquote(name)
|
|
end
|
|
end
|
|
|
|
defmacro attach_function(name, arguments, return_type) do
|
|
argument_names = make_argument_names(arguments)
|
|
|
|
quote do
|
|
def unquote(name)(unquote_splicing(argument_names)) do
|
|
definition = {ffi_lib,
|
|
unquote(name),
|
|
unquote(arguments),
|
|
unquote(return_type)}
|
|
|
|
FFI.call(definition, [unquote_splicing(argument_names)])
|
|
end
|
|
end
|
|
end
|
|
|
|
defp make_argument_names(arguments) do
|
|
arguments
|
|
|> Enum.with_index
|
|
|> Enum.map(&make_argument_name/1)
|
|
end
|
|
|
|
defp make_argument_name({_type, index}) do
|
|
variable_name = [?a + index]
|
|
|> to_string
|
|
|> String.to_atom
|
|
|
|
Macro.var(variable_name, nil)
|
|
end
|
|
end
|