mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-19 05:39:17 +02:00
45 lines
1.1 KiB
Scheme
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))
|