(define-module (backend tacky traverse) #:use-module (backend ast ir) #:export (func-ir stmt-ir )) (define (func-ir name instrs) (list 'srout-ir name instrs)) (define (stmt-ir val) (list 'instrs-ir (cons 'list (append (cdr val) (list (list 'ret-ir (car val))))))) (define (expr-ir op val) (make-instruction op (car val) (cdr val))) (define (const-ir val) (cons (imm-ir 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-ir count))))