i2.scm 501 B

1234567891011121314151617181920212223242526
  1. #lang racket
  2. (require racket/match)
  3. (define builtins
  4. `((car . ,car)
  5. (cdr . ,cdr)
  6. (cons . ,cons)
  7. (+ . ,+)
  8. (- . ,-)
  9. (* . ,*)
  10. (/ . ,/)))
  11. (define (i exp env)
  12. (match exp
  13. ((? number? n) n)
  14. ((? symbol? s)
  15. (cond ((assoc s env) => cdr)
  16. (else (error "unbound variable" s))))
  17. ((? list? l)
  18. (apply (i (car l) env) (map (lambda (exp) (i exp env)) (cdr l))))
  19. (else (error "unknown expression type" exp))))
  20. ;; > (i '(+ 7 (car (cons 3 5))) builtins)
  21. ;; 10