Long time not to post on the blog.
Here is part of the code of the solution of Exercise 5.38 of SICP
You can find complete code for compiler part and syntax part.
--------------------------------------------------------------------
(define (compile-primitive-plus exp target linkage)
(define (iter exp target)
(let ((args (operands exp)))
(if (null? (cddr args))
(append-instruction-sequences
(spread-arguments args)
(make-instruction-sequence
'(arg1 arg2)
'(val)
`((assign val (op +) (reg arg1) (reg arg2)))))
(append-instruction-sequences
(compile (car args) 'arg1 'next)
(preserving
'(arg1 env)
(iter (cons '+ (cdr args)) 'val)
(make-instruction-sequence
'(arg1)
'(val)
`((assign val (op +) (reg arg1) (reg val)))))))))
(end-with-linkage
linkage
(append-instruction-sequences
(iter exp target)
(make-instruction-sequence
'(val) '(,target)
`((assign ,target (reg val)))))))
(define (compile-primitive-multiply exp target linkage)
(define (iter exp target)
(let ((args (operands exp)))
(if (null? (cddr args))
(append-instruction-sequences
(spread-arguments args)
(make-instruction-sequence
'(arg1 arg2)
'(val)
`((assign val (op *) (reg arg1) (reg arg2)))))
(append-instruction-sequences
(compile (car args) 'arg1 'next)
(preserving
'(arg1 env)
(iter (cons '* (cdr args)) 'val)
(make-instruction-sequence
'(arg1)
'(val)
`((assign val (op *) (reg arg1) (reg val)))))))))
(end-with-linkage
linkage
(append-instruction-sequences
(iter exp target)
(make-instruction-sequence
'(val) '(,target)
`((assign ,target (reg val)))))))
(define (spread-arguments args)
(let ((op1 (compile (car args) 'arg1 'next))
(op2 (compile (cadr args) 'arg2 'next)))
(append-instruction-sequences
op1
(preserving '(arg1)
op2
(make-instruction-sequence '(arg1) '() '())))))