Un proyecto de aprendizaje para dominar FFI (Foreign Function Interface) entre Gleam y Erlang, utilizando Mnesia como base de datos distribuida.
FFIME demuestra cómo crear una integración limpia entre Gleam y Erlang, específicamente mostrando:
- FFI de Gleam a Erlang: Llamadas desde código Gleam a funciones nativas de Erlang
- Base de datos Mnesia: Configuración, creación de tablas y operaciones CRUD
- Nodos distribuidos: Configuración de nodos Erlang con nombres cortos
- Manejo de errores: Gestión robusta de errores entre ambos lenguajes
ffime/
├── src/
│ ├── ffime.gleam # Punto de entrada principal
│ └── ffi/
│ ├── mnesia.gleam # Definiciones FFI para Gleam
│ └── database.erl # Implementación en Erlang
└── README.md
import ffi/mnesia
import gleam/io
import gleam/string
pub fn main() {
io.println("Starting...")
let _init_result = mnesia.init()
io.println("Init done")
let add_result = mnesia.add_user(1, "Juan")
io.println("Add done")
let get_result = mnesia.get_user(1)
io.println("Get done")
io.println("Add result:")
io.println(string.inspect(add_result))
io.println("Get result:")
io.println(string.inspect(get_result))
}Funcionalidad:
- Inicializa la base de datos Mnesia
- Crea un usuario de prueba
- Consulta el usuario creado
- Muestra los resultados de todas las operaciones
@external(erlang, "database", "init")
pub fn init() -> String
@external(erlang, "database", "add_user")
pub fn add_user(id: Int, name: String) -> String
@external(erlang, "database", "get_user")
pub fn get_user(id: Int) -> StringFuncionalidad:
- Define las funciones externas que llaman al código Erlang
- Especifica los tipos de entrada y salida para cada función
- Actúa como puente entre Gleam y Erlang
- Inicia un nodo distribuido con nombre corto
ffime - Configura y crea el schema de Mnesia
- Crea la tabla
usercon persistencia en disco - Maneja errores de forma robusta
- Crea un nuevo registro de usuario
- Ejecuta la operación dentro de una transacción Mnesia
- Retorna
"ok"en caso de éxito o descripción del error
- Busca un usuario por ID
- Retorna
"found: <nombre>"si existe o"not_found"si no existe - Maneja errores de transacción
- Tipo: Base de datos distribuida embebida
- Persistencia:
disc_copies- datos almacenados en disco - Tabla:
usercon camposidyname - Transacciones: Todas las operaciones son transaccionales
- Nombre:
ffime(nombre corto) - Tipo:
shortnamespara desarrollo local - Auto-configuración: Se configura automáticamente en
init/0
- Try-catch: Captura excepciones en la inicialización
- Pattern matching: Manejo específico de diferentes tipos de errores
- Strings de respuesta: Todos los errores se convierten a strings legibles
- Gleam instalado
- Erlang/OTP instalado
# Clonar el repositorio
git clone https://github.com/jclumbiarres/ffime.git
cd ffime
# Ejecutar el proyecto
gleam run --target erlangStarting...
Init done
Add done
Get done
Add result:
"ok"
Get result:
"found: Juan"
-
FFI (Foreign Function Interface)
- Definición de funciones externas en Gleam
- Mapeo de tipos entre Gleam y Erlang
- Manejo de valores de retorno
-
Mnesia Database
- Configuración de nodos distribuidos
- Creación de schemas y tablas
- Operaciones CRUD transaccionales
-
Interoperabilidad Gleam-Erlang
- Conversión de tipos de datos
- Manejo de strings y charlists
- Gestión de errores entre lenguajes
Distribuido bajo la Licencia Apache 2.0. Ver LICENSE para más información.
Juan Carlos Lumbiarres - @jclumbiarres
Proyecto Link: https://github.com/jclumbiarres/ffime