init-defpackage.scm 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Jonathan Rees, Mike Sperber
  3. ; This file should be loaded into the bootstrap linker before any use
  4. ; of DEFINE-STRUCTURE. Compare with env/init-defpackage.scm.
  5. (define (evaluate-transformer exp env)
  6. (if (and (pair? exp)
  7. (eq? (car exp) 'syntax-rules))
  8. (if (pair? (cdr exp))
  9. (let ((subkeywords (cadr exp))
  10. (rules (cddr exp)))
  11. (if (and (list? subkeywords)
  12. (every name? subkeywords))
  13. (call-with-values
  14. (lambda ()
  15. (process-rules exp name? (lambda (x) x) eq?))
  16. (lambda (code inserted)
  17. ;; Pair of the procedure and list of auxiliary names
  18. (cons
  19. (eval `(let ((transformer ,code))
  20. (lambda (exp rename compare) ; turn 4-arg transformer into 3-arg transformer
  21. (transformer exp name? rename compare)))
  22. env)
  23. inserted)))
  24. exp))
  25. exp)
  26. (eval exp env)))
  27. (define-syntactic-tower-maker
  28. (lambda (clauses names)
  29. (let ((env (interaction-environment)))
  30. (delay
  31. (begin (if (not (null? clauses))
  32. (warn "a FOR-SYNTAX clause appears in a package being linked by the cross-linker"
  33. `(for-syntax ,@clauses)))
  34. (cons evaluate-transformer env))))))
  35. (define-reader read)