git » blacktide.git » master » tree

[master] / src / com / tailrecursion / blacktide / compiler / passes / lexical.clj

(ns ^:typed.clojure com.tailrecursion.blacktide.compiler.passes.lexical
  "Expose loop bindings and simultaneous recur arguments for expression lowering."
  (:require [com.tailrecursion.nanopass :as np]
            [com.tailrecursion.blacktide.compiler.languages :as l]))

(np/defpass introduce {:from [l/Represented Expr] :to [l/Lexical Expr]}
  [node]
  :bind (assoc node :body (introduce (:body node)))
  :join (assoc node :value (introduce (:value node)) :body (introduce (:body node)))
  :branch (assoc node :yes (introduce (:yes node)) :no (introduce (:no node)))
  :switch (assoc node :arms (mapv introduce (:arms node)))
  :loop {:op :loop :bindings (mapv (fn [id] {:target id :value {:op :local :id id}}) (:slots node))
         :body (introduce (:body node))}
  :recur {:op :recur :args (mapv (fn [id] {:op :local :id id}) (:slots node))}
  :return node :throw node)


(np/defpass program {:from [l/Represented Program] :to [l/Lexical Program] :body true}
  [program] (assoc program :body (introduce (:body program))))