config.scm 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. ; Copyright (c) 1993-2007 by Richard Kelsey and Jonathan Rees. See file COPYING.
  2. ; Stub support for DEFINE-PACKAGE and DEFINE-INTERFACE macros.
  3. (define (load-configuration filename . rest)
  4. (let ((save filename))
  5. (dynamic-wind (lambda () (set! *source-file-name* filename))
  6. (lambda ()
  7. (apply load filename rest))
  8. (lambda () (set! *source-file-name* save)))))
  9. (define (%file-name%) *source-file-name*)
  10. (define *source-file-name* "")
  11. ; --------------------
  12. ; Structures are views into packages.
  13. (define (make-structure package int-thunk . name-option)
  14. (let ((struct (vector '<structure>
  15. #f
  16. package
  17. (if (procedure? int-thunk)
  18. int-thunk
  19. (lambda () int-thunk))
  20. #f)))
  21. (if (not (null? name-option))
  22. (note-structure-name! struct (car name-option)))
  23. struct))
  24. (define (structure? thing)
  25. (and (vector? thing)
  26. (not (zero? (vector-length thing)))
  27. (eq? '<structure> (vector-ref thing 0))))
  28. (define (structure-name s) (vector-ref s 1))
  29. (define (set-structure-name! s name) (vector-set! s 1 name))
  30. (define (structure-package s) (vector-ref s 2))
  31. (define (structure-interface-thunk s) (vector-ref s 3))
  32. (define (structure-interface-really s) (vector-ref s 4))
  33. (define (set-structure-interface! s i) (vector-set! s 4 i))
  34. (define (structure-interface s)
  35. (or (structure-interface-really s)
  36. (begin (initialize-structure! s)
  37. (structure-interface-really s))))
  38. (define (initialize-structure! s)
  39. (let ((int ((structure-interface-thunk s))))
  40. (begin (set-structure-interface! s int)
  41. (note-reference-to-interface! int s))))
  42. (define (verify-later! thunk) 'lose)
  43. (define (set-verify-later! proc) 'lose)
  44. ;(define *all-files* '())------------
  45. ; We assume that the commands are not actually necessary.
  46. (define (make-modified-structure struct commands)
  47. struct)
  48. ; Packages are not what they appear to be.
  49. (define (make-a-package opens-thunk accesses-thunk tower
  50. file-name clauses name)
  51. (vector '<a-package>
  52. (delay (opens-thunk))
  53. (delay (accesses-thunk))
  54. file-name
  55. clauses
  56. #f))
  57. (define (package-opens p) (force (vector-ref p 1)))
  58. (define (package-accesses p) (force (vector-ref p 2)))
  59. (define (package-file-name p) (vector-ref p 3))
  60. (define (package-clauses p) (vector-ref p 4))
  61. (define (package-loaded? p) (vector-ref p 5))
  62. (define (set-package-loaded?! p ?) (vector-set! p 5 ?))
  63. (define (initialize-package! p) 'lose)
  64. ; The package hierarchy
  65. (define (first p l)
  66. (let loop ((l l))
  67. (and (not (null? l))
  68. (or (and (p (car l)) (car l))
  69. (loop (cdr l))))))
  70. (define *structures* '())
  71. (define (all-structures) *structures*)
  72. (define (find-structure name)
  73. (first (lambda (struct)
  74. (eq? name (structure-name struct)))
  75. *structures*))
  76. (define *packages* '())
  77. (define *interfaces* '())
  78. (define (register-structure! struct)
  79. (set! *structures* (cons struct *structures*)))
  80. (define (register-interface! int)
  81. (set! *interfaces* (cons int *interfaces*)))
  82. (define (register-package! p)
  83. (set! *packages* (cons p *packages*)))
  84. (define (initialize-module-system!)
  85. (set! *structures* '())
  86. (set! *packages* '())
  87. (set! *interfaces* '()))
  88. (define (note-name! thing name)
  89. (cond ((interface? thing)
  90. (note-interface-name! thing name))
  91. ((structure? thing)
  92. (note-structure-name! thing name)))
  93. thing)
  94. (define (note-structure-name! struct name)
  95. (if (and name (not (structure-name struct)))
  96. (begin
  97. (set-structure-name! struct name)
  98. (note-package-name! (structure-package struct) name)
  99. (register-structure! struct))))
  100. (define (note-package-name! package name)
  101. (register-package! package))
  102. (define dummy-package
  103. (make-a-package (lambda () '()) (lambda () '()) #f "" '() #f))
  104. (define dummy-interface
  105. (make-simple-interface 'dummy-interface '()))
  106. ; source-file-names ?
  107. (define module-system
  108. (make-structure dummy-package dummy-interface 'module-system))
  109. (define scheme
  110. (make-structure dummy-package dummy-interface 'scheme))
  111. (define built-in-structures
  112. (make-structure dummy-package dummy-interface 'built-in-structures))
  113. ; Stuff copied from rts/filename.scm... ugh...
  114. ; Namelist = ((dir ...) basename type)
  115. ; or ((dir ...) basename)
  116. ; or (dir basename type)
  117. ; or (dir basename)
  118. ; or basename
  119. (define (namestring namelist dir default-type)
  120. (let ((namelist (if (list? namelist) namelist (list '() namelist))))
  121. (let ((subdirs (if (list? (car namelist))
  122. (car namelist)
  123. (list (car namelist))))
  124. (basename (cadr namelist))
  125. (type (if (null? (cddr namelist))
  126. default-type
  127. (caddr namelist))))
  128. (string-append (or dir "")
  129. (apply string-append
  130. (map (lambda (subdir)
  131. (string-append
  132. (namestring-component subdir)
  133. directory-component-separator))
  134. subdirs))
  135. (namestring-component basename)
  136. (if type
  137. (string-append type-component-separator
  138. (namestring-component type))
  139. "")))))
  140. (define directory-component-separator "/") ;unix sux
  141. (define type-component-separator ".")
  142. (define (namestring-component x)
  143. (cond ((string? x) x)
  144. ((symbol? x)
  145. (list->string (map file-name-preferred-case
  146. (string->list (symbol->string x)))))
  147. (else
  148. ;; (error "bogus namelist component" x)
  149. "bogus namelist component")))
  150. (define file-name-preferred-case char-downcase)
  151. (define *scheme-file-type* 'scm)
  152. (define *load-file-type* *scheme-file-type*) ;#F for Pseudoscheme or T
  153. (define (file-name-directory filename)
  154. (substring filename 0 (file-nondirectory-position filename)))
  155. (define (file-name-nondirectory filename)
  156. (substring filename
  157. (file-nondirectory-position filename)
  158. (string-length filename)))
  159. (define (file-nondirectory-position filename)
  160. (let loop ((i (- (string-length filename) 1)))
  161. (cond ((< i 0) 0)
  162. ;; Heuristic. Should work for DOS, Unix, VMS, MacOS.
  163. ((string-posq (string-ref filename i) "/:>]\\") (+ i 1))
  164. (else (loop (- i 1))))))
  165. (define (string-posq thing s)
  166. (let loop ((i 0))
  167. (cond ((>= i (string-length s)) #f)
  168. ((eq? thing (string-ref s i)) i)
  169. (else (loop (+ i 1))))))
  170. (define interface-of structure-interface)
  171. (define-reflective-tower-maker list)