(define-module (backend tacky traverse) #:use-module (backend ast ir) #:export (func stmt unary const)) (define (func name instrs) (list 'srout name instrs)) (define (stmt val) (list 'instrs (cons 'list (append (cdr val) (list (list 'ret (car val))))))) (define (expr op val) (make-instruction op (car val) (cdr val))) (define (const val) (cons (imm val) '())) (define (make-instruction op src instrs) (let ((dst (make-temporary))) (cons dst (append instrs (list (op src dst)))))) (define make-temporary (let ((count 100)) (lambda () (set! count (1+ count)) (list 'tmp count))))