All pastes #776476 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-11-16 02:28 UTC
rendered paste body
;;a7q4

;;
;;
;;
(define (compile expr)
  (local
    [(define (eval expr x-val)
  (cond
    [(cons? (first expr)) (eval (first expr) x-val)]
    [(number? (first expr)) (first expr)]
    [(symbol=? (first expr) 'x) x-val]
    
    [(symbol=? (first expr) '*)
     (local ((define (x expr)
               (cond
                 [(empty? expr) 1]
                 [(or (symbol? (first expr)) 
                      (cons? (first expr))) 
                  (* (eval expr x-val) (x (rest expr)))]
                 [else (* (first expr) (x (rest expr)))])))
       (x (rest expr)))]
    [(symbol=? (first expr) '/)
     (local ((define (x expr)
               (cond
                 [(empty? expr) 1]
                 [(or (symbol? (first expr)) 
                      (cons? (first expr))) 
                  (/ (eval expr x-val) (x (rest expr)))]
                 [else (/ (first expr) (x (rest expr)))])))
       (x (rest expr)))]
    
    [(symbol=? (first expr) '+)
     (local ((define (x expr)
               (cond
                 [(empty? expr) 0]
                 [(or (symbol? (first expr)) 
                      (cons? (first expr))) 
                  (+ (eval expr x-val) (x (rest expr)))]
                 [else (+ (first expr) (x (rest expr)))])))
       (x (rest expr)))]
    
    [(symbol=? (first expr) '-)
     (local ((define (x expr)
               (cond
                 [(empty? expr) 0]
                 [(or (symbol? (first expr)) 
                      (cons? (first expr))) 
                  (- (eval expr x-val) (x (rest expr)))]
                 [else (- (first expr) (x (rest expr)))])))
       (x (rest expr)))]
    
    [(symbol=? (first expr) 'pow)
     (local ((define (x expr)
               (cond
                 [(empty? expr) 1]
                 [(or (symbol? (first expr)) 
                      (cons? (first expr))) 
                  (expt (eval expr x-val) (x (rest expr)))]
                 [else (expt (first expr) (x (rest expr)))])))
       (x (rest expr)))]))]
    (lambda (x) (eval expr x))))

(compile '(+ 1 x))