   (reduce str (map #(emit-code %) s)))
 
 (defn define
-  ([name value & dependencies]
-     {:type :define
-      :name name
-      :value value
-      :dependencies dependencies})
-  ([name value]
-     (define name value nil))
-  ([name]
-     (define name nil nil)))
+  [name value & dependencies]
+  {:type :define
+   :name name
+   :value value
+   :dependencies dependencies})
 
 (defemit :define [m]
   (if (:value m)

    (str "#include \"" (:file m) "\"")))

(defn ifdef
  ([cond then else & dependencies]
     {:type :ifdef
      :cond cond
      :then then
      :else else
      :dependencies dependencies})
  ([cond then else]
     (ifdef cond then else nil))
  ([cond then]
     (ifdef cond then nil nil)))

(defemit :ifdef [m]
  (if (:else m)


(defn find-dependencies [s expr]
  (let [deps (:dependencies expr)]
    ;;(println deps)
    (cond
     deps (do
            ;;(println (concat deps (map find-dependencies s deps)))
            (concat deps (map find-dependencies s deps))))))

(defn emit-program [s]
