Volver al código Lua

Recordar resultados caros para no calcularlos dos veces

Memoización en diez líneas: una función que envuelve a otra y guarda lo que ya respondió.

El problema

Una función se llama cientos de veces con los mismos argumentos y cada llamada cuesta: una consulta, un cálculo pesado. Calcular una vez y recordar es la optimización más barata.

Lua
local function memoizar(fn)
  local cache = {}
  return function(n)
    local v = cache[n]
    if v == nil then
      v = fn(n)
      cache[n] = v
    end
    return v
  end
end

local precio_con_impuesto
precio_con_impuesto = memoizar(function(codigo)
  print("  (calculando " .. codigo .. ")")      -- simula una consulta cara
  local base = ({ A1 = 100, B2 = 250 })[codigo] or 0
  return base * 1.07
end)

print(precio_con_impuesto("A1"))   -- calcula
print(precio_con_impuesto("A1"))   -- sale de la caché
print(precio_con_impuesto("B2"))   -- calcula

Por qué está escrito así

  1. memoizar recibe una función y devuelve otra que hace lo mismo, pero consulta primero su tabla.
  2. La tabla cache vive en el cierre: cada función memoizada tiene la suya y nadie más la ve.
  3. En Lua las tablas son a la vez diccionario y arreglo, así que la caché no necesita ninguna estructura especial.
  4. El mensaje "calculando" aparece dos veces en tres llamadas: esa es la prueba de que funciona.
Cómo probarlo

Guardalo como memo.lua y corré: lua memo.lua

Ojo con esto

La caché no vence nunca: si el precio cambia, la función sigue devolviendo el viejo. Y un resultado nil no se guarda, así que se recalcula cada vez.

Adaptalo a tu caso con IA

El botón copia este prompt con el código pegado debajo. Reemplazá los corchetes con lo tuyo y pegalo en ChatGPT, Claude, Gemini o Copilot.

El prompt
Tengo esta memoización en Lua. Extendela para funciones de varios argumentos, con vencimiento de [SEGUNDOS] segundos por entrada y un tope de [CANTIDAD] entradas descartando la más vieja. La voy a usar en [DÓNDE: un juego con LÖVE, Nginx con OpenResty, Redis, Neovim]. Agregá una función para vaciar la caché a mano y mostrame cómo medir cuántos aciertos tiene.

Ejemplo escrito y revisado a mano.

Compartir

Comentarios

Todavía no hay comentarios. El primero puede ser el tuyo.

Solo texto, sin enlaces. No se pide correo. Los comentarios se revisan antes de publicarse.

¿Lo adaptaste a algo tuyo?

Contame qué resolviste con esto, o qué le faltó.

Seguí probando

Más código

Ver todos
Darinel Ortega En línea · respondo durante el día
Hoy
Hola. Acá no vendo nada: esto es para intercambiar conocimiento sobre tecnología.
Escribime lo que quieras — podés mandar texto, imágenes o documentos. Los mensajes llegan a mi consola y te respondo desde ahí.
Estás escribiendo fuera de horario. Te leo apenas empiece el día.

Conversación abierta para compartir conocimiento. Los mensajes llegan a mi consola y respondo desde ahí.

Agendemos una conversación

Elegí el día y la hora que te sirvan. Son treinta minutos, sin agenda comercial.

Videollamada

Para una videollamada, pedila por acá y te paso el enlace de la sesión.