expand.scm 2.1 KB

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