flatload.scm 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Jonathan Rees, Mike Sperber
  3. ; flatloaded -> load
  4. (define *noisy?* #f)
  5. (define (flatload struct . env-option)
  6. (let ((env (if (null? env-option)
  7. (interaction-environment)
  8. (car env-option)))
  9. (l '())
  10. (set-package-loaded?! set-package-loaded?!))
  11. (walk-packages (list struct)
  12. (lambda (p)
  13. (not (package-loaded? p)))
  14. (lambda (file p)
  15. (let* ((fn (package-file-name p))
  16. (file (namestring file
  17. (if fn
  18. (file-name-directory fn)
  19. #f)
  20. *load-file-type*)))
  21. (if *noisy?*
  22. (begin (display #\space) (display file)))
  23. (set! l (cons (lambda () (apply fload file env-option))
  24. l))))
  25. (lambda (forms p)
  26. (set! l (cons (lambda ()
  27. (for-each (lambda (form)
  28. (eval form env))
  29. forms))
  30. l)))
  31. (lambda (p)
  32. (set! l (cons (lambda ()
  33. (set-package-loaded?! p #t))
  34. l))))
  35. (for-each (lambda (thunk) (thunk)) (reverse l))
  36. (newline)))
  37. (define (fload filename . rest)
  38. (let ((save filename))
  39. (dynamic-wind (lambda () (set! *source-file-name* filename))
  40. (lambda ()
  41. (apply load filename rest))
  42. (lambda () (set! *source-file-name* save)))))
  43. (define (walk-packages structs process? file-action forms-action after-action)
  44. (let ((seen '()))
  45. (letrec ((recur
  46. (lambda (s)
  47. (let ((p (structure-package s)))
  48. (if (not (memq p seen))
  49. (begin
  50. (set! seen (cons p seen))
  51. (if (process? p)
  52. (begin
  53. (if *noisy?*
  54. (begin (newline)
  55. (display "[")
  56. (write (structure-name s))))
  57. ;; (write (structure-name s)) (display " ")
  58. (for-each recur (package-opens p))
  59. (for-each (lambda (name+struct)
  60. (recur (cdr name+struct)))
  61. (package-accesses p))
  62. (for-each (lambda (clause)
  63. (case (car clause)
  64. ((files)
  65. (for-each (lambda (f)
  66. (file-action f p))
  67. (cdr clause)))
  68. ((begin)
  69. (forms-action (cdr clause) p))))
  70. (package-clauses p))
  71. (after-action p)
  72. (if *noisy?* (display "]"))))))))))
  73. (for-each recur structs))
  74. (if *noisy?* (newline))
  75. seen))
  76. ; Return list of names of all files needed to build a particular structure.
  77. ; This is handy for creating dependency lists for "make".
  78. (define (all-file-names struct . base-option)
  79. (let ((l '())
  80. (b '()))
  81. (walk-packages base-option
  82. (lambda (p) #t)
  83. (lambda (filename p) #f)
  84. (lambda (forms p) #f)
  85. (lambda (p)
  86. (set! b (cons p b))))
  87. (walk-packages (list struct)
  88. (lambda (p)
  89. (not (memq p b)))
  90. (lambda (filename p)
  91. (let ((dir (file-name-directory (package-file-name p))))
  92. (set! l (cons (namestring filename dir *load-file-type*)
  93. l))))
  94. (lambda (forms p)
  95. (display "Package contains (begin ...) clause: ")
  96. (write forms)
  97. (newline))
  98. (lambda (p) #f))
  99. (reverse l)))