lexical-envs.scm 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. (define-module (analyzer lexical-envs)
  2. #:export (make-environment
  3. environment-append-pairs
  4. environment-append-names-values
  5. environment-lookup))
  6. ;; we will represent environments as association lists.
  7. (define (make-environment)
  8. '())
  9. ;; append some name-value pairs to an environment
  10. ;; environments match names to value-sets.
  11. (define (environment-append-pairs env . args)
  12. (let inner ((arg-lst args))
  13. (if (null? arg-lst)
  14. env
  15. (cons (car arg-lst)
  16. (inner (cdr arg-lst))))))
  17. ;; the difference between environment-append-pairs and
  18. ;; environment-append-names-values is that in the first one, you have
  19. ;; pairs of (name, value), and in the second, you have a list of names
  20. ;; and a matching list of values
  21. (define (environment-append-names-values env names values)
  22. (cond ((and (null? names) (null? values))
  23. env)
  24. ((or (null? names) (null? values))
  25. (error "environment-append-names-values got different-length lists!"))
  26. (else
  27. (cons (cons (car names) (car values))
  28. (environment-append-names-values env (cdr names) (cdr values))))))
  29. (define (environment-lookup env name)
  30. (assq-ref env name))