• ☆ Yσɠƚԋσʂ ☆
    link
    fedilink
    arrow-up
    1
    ·
    3 years ago

    best of both world with Lisp macros :)

    (defmacro gen-fib [size]
      (let [values (->> (iterate (fn [[a b]] [b (+ a b)]) [0 1])
                        (map first)
                        (take size)
                        (vec))]
        `(defn ~'fib [~'n] (~values ~'n))))
    
    (macroexpand-1 '(gen-fib 10))
    ;=> (clojure.core/defn fib [n] ([0 1 1 2 3 5 8 13 21 34] n))
    
    (gen-fib 10)
    
    (fib 9)
    ;=> 34