; AR ::= (make-var symbol) | (make-const integer) | (make-proc var AR) |
;        (make-app (AR AR)
(define-struct var (symbol))   
(define-struct const (number)) 
(define-struct proc (var body))
(define-struct app (rator rand))
; Note type contracts on structures is given in definition of AR above

; template for processing AR (LC abstract representation/syntax)

(define fAR
  (lambda (an-ar ...)  ; an-ar is an ar
    (cond
      ((var? an-ar) ... (var-symbol an-ar) ...)
      ((const? an-ar) ... (const-number an-ar) ...)
      ((proc? an-ar)  ... (fAR ... (proc-body an-ar)) ...)
      ((app? an-ar) ... (fAR ... (app-rator an-ar))
                        (fAR ... (app-rand an-ar)) ... ))))

; SDAR ::= (make-sdvar integer) | (make-num integer) | (make-sdproc SDAR) |
;          (make-app AR AR)

(define-struct sdvar (index))
(define-struct num (value))
(define-struct sdproc (body))
         
(define ar1 (make-app (make-proc (make-var x) (make-var x)) (make-const 1)))
(define sdar1 (make-app 
(define sd ...)