(import (scheme base) (scheme write) (scheme cyclone util) (scheme cyclone pretty-print))

(define sexp
  '(Cyc-seq
         (set! b '(#f . #f))
         (Cyc-seq
           (set-car!  a 1)
           (Cyc-seq
             (set-cdr!  a '(2))
             ((fnc a1 a2 a3))))))

;; Flatten a list containing subcalls of a given symbol.
;; For example, the expression: 
;;
;;  '(Cyc-seq
;;         (set! b '(#f . #f))
;;         (Cyc-seq
;;           (set-car!  a 1)
;;           (Cyc-seq
;;             (set-cdr!  a '(2))
;;             ((fnc a1 a2 a3)))))
;;
;; becomes:
;;
;;  '(Cyc-seq
;;     (set! b '(#f . #f))
;;     (set-car! a 1)
;;     (set-cdr! a '(2))
;;     ((fnc a1 a2 a3)))
;;
(define (flatten-subcalls sexp sym)
  (define (flat sexp acc)
    (cond
      ((not (pair? sexp))
       acc)
      ((and (tagged-list? sym (car sexp)))
        (flat (cdar sexp) acc))
      (else ;;(pair? sexp)
        (flat (cdr sexp) (cons (car sexp) acc))))
  )
  (reverse
    (flat sexp '())))

(pretty-print (flatten-subcalls sexp 'Cyc-seq))
(pretty-print (flatten-subcalls '(a b c d e (f (g))) 'Cyc-seq))