cyclone/flatten-seq.scm

45 lines
1.1 KiB
Scheme

(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))