expand.scm 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey
  3. ; Expanding using the Scheme 48 expander.
  4. (define (scan-packages packages)
  5. (let ((definitions
  6. (fold (lambda (package definitions)
  7. (let ((cenv (package->environment package)))
  8. (fold (lambda (form definitions)
  9. (let ((node (expand-form form cenv)))
  10. (cond ((define-node? node)
  11. (cons (eval-define (expand node cenv)
  12. cenv)
  13. definitions))
  14. (else
  15. (eval-node (expand node cenv)
  16. global-ref
  17. global-set!
  18. eval-primitive)
  19. definitions))))
  20. (call-with-values
  21. (lambda ()
  22. (package-source package))
  23. (lambda (files.forms usual-transforms primitives?)
  24. (scan-forms (apply append (map cdr files.forms))
  25. cenv)))
  26. definitions)))
  27. packages
  28. '())))
  29. (reverse (map (lambda (var)
  30. (let ((value (variable-flag var)))
  31. (set-variable-flag! var #f)
  32. (cons var value)))
  33. definitions))))
  34. (define package->environment (structure-ref packages package->environment))
  35. (define define-node? (node-predicate 'define))
  36. (define (eval-define node cenv)
  37. (let* ((form (node-form node))
  38. (value (eval-node (caddr form)
  39. global-ref
  40. global-set!
  41. eval-primitive))
  42. (lhs (cadr form)))
  43. (global-set! lhs value)
  44. (name->variable-or-value lhs)))
  45. (define (global-ref name)
  46. (let ((thing (name->variable-or-value name)))
  47. (if (variable? thing)
  48. (variable-flag thing)
  49. thing)))
  50. (define (global-set! name value)
  51. (let ((thing (name->variable-or-value name)))
  52. (if (primitive? thing)
  53. (bug "trying to set the value of primitive ~S" thing)
  54. (set-variable-flag! thing value))))
  55. (define (name->variable-or-value name)
  56. (let ((binding (node-ref name 'binding)))
  57. (if (binding? binding)
  58. (let ((value (binding-place binding))
  59. (static (binding-static binding)))
  60. (cond ((primitive? static)
  61. static)
  62. ((variable? value)
  63. value)
  64. ((and (location? value)
  65. (constant? (contents value)))
  66. (contents value))
  67. (else
  68. (bug "global binding is not a variable, primitive or constant ~S" name))))
  69. (user-error "unbound variable ~S" (node-form name)))))