i3.scm 578 B

1234567891011121314151617181920212223242526272829
  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. (`(lambda (,x) ,b)
  18. (lambda (y)
  19. (i b (cons (cons x y) env))))
  20. ((? list? l)
  21. (apply (i (car l) env) (map (lambda (exp) (i exp env)) (cdr l))))
  22. (else (error "unknown expression type" exp))))
  23. ;; > (i '(+ 7 (car (cons 3 5))) builtins)
  24. ;; 10