env.scm 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Jonathan Rees, Mike Sperber
  3. ; Accessing packages
  4. (define (environment-ref package name)
  5. (carefully (package-lookup package name)
  6. (lambda (loc)
  7. (if (location-assigned? loc)
  8. (contents loc)
  9. (assertion-violation 'environment-ref "uninitialized variable"
  10. name package)))
  11. package
  12. name))
  13. (define (environment-set! package name value)
  14. (let ((binding (package-lookup package name)))
  15. (if (and (binding? binding)
  16. (not (variable-type? (binding-type binding))))
  17. (assertion-violation 'environment-set! "invalid assignment" name package value)
  18. (carefully binding
  19. (lambda (loc)
  20. (set-contents! loc value))
  21. package name))))
  22. (define (environment-define! package name value)
  23. (set-contents! (package-define! package name usual-variable-type #f #f)
  24. value))
  25. (define (*structure-ref struct name)
  26. (let ((binding (structure-lookup struct name #f)))
  27. (if binding
  28. (carefully binding contents struct name)
  29. (assertion-violation 'structure-ref "name not exported" struct name))))
  30. (define (carefully binding action env name)
  31. (cond ((not binding)
  32. (assertion-violation 'carefully "unbound variable" name env))
  33. ((not (binding? binding))
  34. (assertion-violation 'carefully "peculiar binding" binding name env))
  35. ((eq? (binding-type binding) syntax-type)
  36. (assertion-violation 'carefully "attempt to reference syntax as variable"
  37. name env))
  38. (else
  39. (let ((loc (binding-place binding)))
  40. (if (location? loc)
  41. (if (location-defined? loc)
  42. (action loc)
  43. (assertion-violation 'carefully "unbound variable" name env))
  44. (assertion-violation 'carefully "variable has no location" name env))))))
  45. ; Interaction environment
  46. (define $interaction-environment (make-fluid (make-cell #f)))
  47. (define (interaction-environment)
  48. (fluid-cell-ref $interaction-environment))
  49. (define (set-interaction-environment! p)
  50. (if (package? p)
  51. (fluid-cell-set! $interaction-environment p)
  52. (assertion-violation 'set-interaction-environment!
  53. "invalid package" set-interaction-environment! p)))
  54. (define (with-interaction-environment p thunk)
  55. (if (package? p)
  56. (let-fluid $interaction-environment (make-cell p) thunk)
  57. (assertion-violation 'with-interaction-environment
  58. "invalid package" with-interaction-environment p)))
  59. ; Scheme report environment. Should be read-only; fix later.
  60. (define (scheme-report-environment n)
  61. (if (= n *scheme-report-number*)
  62. *scheme-report-environment*
  63. (assertion-violation 'scheme-report-environment
  64. "no such Scheme report environment")))
  65. (define *scheme-report-environment* #f)
  66. (define *null-environment* #f)
  67. (define *scheme-report-number* 0)
  68. (define (set-scheme-report-environment! repnum env)
  69. (set! *scheme-report-number* repnum)
  70. (set! *scheme-report-environment* env)
  71. (set! *null-environment* env)) ; A cheat.
  72. (define (null-environment n)
  73. (if (= n *scheme-report-number*)
  74. *null-environment*
  75. (assertion-violation 'null-environment
  76. "no such Scheme report environment")))
  77. ; Make an infinite tower of packages for syntax.
  78. ; structs should be a non-null list of structures that should be
  79. ; opened at EVERY level of the tower.
  80. (define (make-syntactic-tower eval structs id)
  81. (let recur ((level 1))
  82. (delay (cons eval
  83. (make-simple-package structs
  84. eval
  85. (recur (+ level 1))
  86. `(for-syntax ,level ,id))))))
  87. ; backwards compatibility for PreScheme compiler
  88. (define make-reflective-tower make-syntactic-tower)
  89. ; (set-syntactic-tower-maker! p (lambda (clauses id) ...))
  90. ; where clauses is a list of DEFINE-STRUCTURE clauses
  91. (define set-syntactic-tower-maker!
  92. (let ((name (string->symbol ".make-syntactic-tower."))
  93. (name2 (string->symbol ".make-reflective-tower.")))
  94. (lambda (p proc)
  95. (environment-define! p name proc)
  96. ;; backwards compatibility for PreScheme compiler
  97. (environment-define! p name2 proc))))
  98. ; backwards compatibility for PreScheme compiler
  99. (define set-reflective-tower-maker!
  100. (let ((reader-name (string->symbol ".reader.")))
  101. (lambda (p proc)
  102. (set-syntactic-tower-maker! p proc)
  103. ;; total, utter kludge:
  104. ;; The reader wasn't configurable in earlier versions of Scheme 48,
  105. ;; so PreScheme doesn't how to initialize it.
  106. (if (not (package-lookup p reader-name))
  107. (environment-define! p reader-name read)))))
  108. (define set-reader!
  109. (let ((name (string->symbol ".reader.")))
  110. (lambda (p reader)
  111. (environment-define! p name reader))))