 
 (defn do-conj [a r] (match [r] [(['do & s] :seq)] `(~'do ~a ~@s) :else `(~'do ~a ~r)))
 
+;; TODO: support changing set of bindings and effects
 (defn &Csuite [x]
   (letfn [(&let-form [s n a b r]
             (&let [a (&C a) r (&Csuite r)]

                        [body innerE] ((&C body) innerE)]
                    (M (check-effects x innerE true)
                       :function args return-type body))))
        [[:return a]] (&m (&tag :return (&C a)))
        [[(:or ':from ':import ':break ':continue) & _]] (&x)
        [[:unwind-protect body protection]]
        (&m (&tag :unwind-protect (&C body) (&C protection)))

        ;; handles argument in the *outer* scope where the function is defined,
        ;; *NOT* in the inner scope that the function defines (see :function for that)
        (&m (&into [:argument id] (&C type) (&C default)))
        [[:return a]] (&m (&tag :return (&C a)))
        [[:function args return-type body]]
        (&m (&let [args (&Cargs args) ; handle type and default
                   return-type (&C return-type)]
