memory_rec

支持递归,但并发不安全。 尾递归函数经过处理后不再是尾递归的,存在爆栈风险。

Examples

// 使用递归版的缓存需要对函数进行一些处理
//
// 很经典的阶乘函数,要想让它能够使用缓存需要以下几步
// pub fn factorial(i: Int) -> Int {
//   factorial_loop(i, i)
// }
//
// fn factorial_loop(i: Int, acc: Int) -> Int {
//   case i {
//     0 | 1 -> acc
//     _ -> factorial_loop(i - 1, acc * { i - 1 })
//   }
// }
// =======================================================================
// 1、
// pub fn factorial(i: Int) -> Int {
//   case i {
//     0 | 1 -> acc
//     _ -> factorial_loop(i - 1, acc * { i - 1 })
//   }
// }
//
// 2、
// fn factorial(rec: fn(#(Int, Int)) -> Int, t: #(Int, Int)) -> Int {
//   let #(i, acc) = t
//
//   case i {
//     0 | 1 -> acc
//     _ -> rec(#(i - 1, acc * { i - 1 }))
//   }
// }
//
// 处理完就是以下样子
pub fn factorial(rec: fn(#(Int, Int)) -> Int, t: #(Int, Int)) -> Int {
  let #(i, acc) = t

  case i {
    0 | 1 -> acc
    _ -> rec(#(i - 1, acc * { i - 1 }))
  }
}

import memory_rec
import gleam/time/timestamp

pub fn main() {
  let time = fn() { timestamp.system_time() |> timestamp.to_unix_seconds() }

  let assert Ok(factorial) = memory_rec.new(factorial)

  // 1. 5.299499034881592
  // 2. 1.6671595573425293
  int.range(0, 2, 0.0, fn(_, _) {
    let t = time()
    factorial(#(40_000, 40_000))
    echo time() -. t
  })
}

Values

pub fn new(
  rec_func: fn(fn(key) -> val, key) -> val,
) -> Result(fn(key) -> val, actor.StartError)

创建并启动缓存

Search Document