                            (and
                              (= (get-type lexpr) [:string])
                              (= (get-type rexpr) [:string])))
-                       (util/succ (with-type [:eadd lexpr [:plus] rexpr] (get-type lexpr)))
+                       (util/succ [vars2 (with-type [:eadd lexpr [:plus] rexpr] (get-type lexpr))])
                        (util/err (str "expected int,int or string,string, found " (print-type (get-type lexpr)) ", " (print-type (get-type rexpr)) " in: " location))
                        )
                  ]


(defn add-arg
  [vmap arg]
  (match/match arg [_ type ident]
    (add-var vmap ident type)
    )
  )

(defn add-args
  [vmap args]
  (loop
    [vmap vmap
     args (rest args)]
    (if (empty? args)
      vmap
      (recur (add-arg vmap (first args)) (rest args))))
  )

(defn terminated

  (match/match funexpr [fun get-type [ident name] args block]
    (m/domonad util/phase-m
      [
       [_ vars1] (add-var (vars-map) "_return_" get-type)
       [nargs vars] (add-args vars1 args)
       [nvars nblock] (annotate-code glob-state vars block)
       ]
      (with-vars
        [fun get-type [ident name] nargs nblock]
        nvars)
      )))

(defn analyze-fun
