Skip to content

Instantly share code, notes, and snippets.

@mkremins
Last active August 29, 2015 14:02
Show Gist options
  • Save mkremins/cc36585eefe4a25f02ee to your computer and use it in GitHub Desktop.
Save mkremins/cc36585eefe4a25f02ee to your computer and use it in GitHub Desktop.
Compile fn from expr containing unbound symbols
(ns expr-fn.core
(:require [clojure.walk :as walk]))
(defn forms-seq [form]
(tree-seq coll?
#(if (map? %) (interleave (keys %) (vals %)) %)
form))
(defn resolved? [form]
(if (coll? form)
(every? resolved? form)
(not (symbol? form))))
(defmacro partial-eval [expr env]
(let [args (->> expr forms-seq (filter symbol?) (remove env) vec)
body (->> expr
(walk/prewalk-replace env)
(walk/prewalk #(if (and (seq? %) (resolved? %))
(apply (first %) (rest %))
%)))]
`(fn ~args ~body)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment