i4.scm 803 B

123456789101112131415161718192021222324252627282930313233343536373839
  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 special-forms
  12. '(lambda))
  13. (define (i exp env spec)
  14. (match exp
  15. ((? number? n) n)
  16. ((? symbol? s)
  17. (cond ((assoc s env) => cdr)
  18. (else (error "unbound variable" s))))
  19. ((? list? l)
  20. (if (member (car l) spec)
  21. (i-special l env spec)
  22. (apply (i (car l) env spec)
  23. (map (lambda (exp) (i exp env spec)) (cdr l)))))
  24. (else (error "unknown expression type" exp))))
  25. (define (i-special exp env spec)
  26. (match exp
  27. (`(lambda (,x) ,b)
  28. (lambda (y)
  29. (i b (cons (cons x y) env) (remove x spec))))
  30. (else (error "Unimplemented special form:" exp))))
  31. ;; > (i '(+ 7 (car (cons 3 5))) builtins)
  32. ;; 10