module-language.scm 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Jonathan Rees, Mike Sperber, Robert Ransom
  3. ; The DEFINE-INTERFACE and DEFINE-STRUCTURE macros.
  4. (define-syntax def
  5. (syntax-rules ()
  6. ((def (?name . ?args) ?body ...)
  7. (really-def () ?name (lambda ?args ?body ...)))
  8. ((def ?name ...)
  9. (really-def () ?name ...))))
  10. (define-syntax really-def
  11. (syntax-rules ()
  12. ((really-def (?name ...) ?exp)
  13. (define-multiple (?name ...)
  14. (begin (verify-later! (lambda () ?name))
  15. ...
  16. ?exp)))
  17. ((really-def (?name ...) ?name1 ?etc ...)
  18. (really-def (?name ... ?name1) ?etc ...))))
  19. (define-syntax define-multiple
  20. (syntax-rules ()
  21. ((define-multiple (?name) ?exp)
  22. (define ?name (note-name! ?exp '?name)))
  23. ((define-multiple (?name ...) ?exp)
  24. (begin (define ?name #f)
  25. ...
  26. (let ((frob (lambda things
  27. (begin (set! ?name
  28. (note-name! (car things) '?name))
  29. (set! things (cdr things)))
  30. ...)))
  31. (call-with-values (lambda () ?exp) frob))))))
  32. ; Interfaces
  33. ; <definition> ::= (define-interface <name> <int>)
  34. ; <int> ::= <name> | (export <item> ...) | (compound-interface <int> ...)
  35. (define-syntax define-interface
  36. (syntax-rules ()
  37. ((define-interface ?name ?int)
  38. (def ?name ?int))))
  39. (define-syntax compound-interface
  40. (syntax-rules ()
  41. ((compound-interface ?int ...)
  42. (make-compound-interface #f ?int ...))))
  43. ; <item> ::= <name> | (<name> <type>) | ((<name> ...) <type>)
  44. (define-syntax export
  45. (lambda (e r c)
  46. (let ((items (cdr e)))
  47. (let loop ((items items)
  48. (plain '())
  49. (others '()))
  50. (if (null? items)
  51. `(,(r 'make-simple-interface)
  52. #f
  53. (,(r 'list) (,(r 'quote) ,(list (reverse plain)
  54. ':undeclared))
  55. ,@(reverse others)))
  56. (let ((item (car items)))
  57. (if (pair? item)
  58. (loop (cdr items)
  59. plain
  60. (cons `(,(r 'list) (,(r 'quote) ,(car item))
  61. ,(cadr item))
  62. others))
  63. (loop (cdr items)
  64. (cons item plain)
  65. others)))))))
  66. (make-simple-interface list quote value))
  67. ; Structures
  68. (define-syntax define-structure
  69. (syntax-rules ()
  70. ((define-structure ?name ?int ?clause1 ?clause ...)
  71. (def ?name (structure ?int ?clause1 ?clause ...)))
  72. ;; For compatibility. Use DEF instead.
  73. ((define-structure ?name ?exp)
  74. (def ?name ?exp))))
  75. (define-syntax define-structures
  76. (syntax-rules ()
  77. ((define-structures ((?name ?int) ...)
  78. ?clause ...)
  79. (def ?name ... (structures (?int ...) ?clause ...)))))
  80. (define-syntax structure
  81. (syntax-rules ()
  82. ((structure ?int ?clause ...)
  83. (structures (?int) ?clause ...))))
  84. (define-syntax structures
  85. (syntax-rules ()
  86. ((structures (?int ...) ?clause ...)
  87. (let ((p (a-package #f ?clause ...)))
  88. (values (make-structure p (lambda () ?int))
  89. ...)))))
  90. (define-syntax modify
  91. (syntax-rules ()
  92. ((modify ?struct ?command ...)
  93. (make-modified-structure ?struct '(?command ...)))))
  94. ; Two handy shorthands for MODIFY.
  95. (define-syntax subset
  96. (syntax-rules ()
  97. ((restrict struct (name ...))
  98. (modify struct (expose name ...)))))
  99. (define-syntax with-prefix
  100. (syntax-rules ()
  101. ((with-prefix struct the-prefix)
  102. (modify struct (prefix the-prefix)))))
  103. ; Packages
  104. (define-syntax a-package
  105. (let ()
  106. (define (parse-package-clauses clauses rename compare)
  107. (let ((%open (rename 'open))
  108. (%access (rename 'access))
  109. (%for-syntax (rename 'for-syntax)))
  110. (let loop ((clauses clauses)
  111. (opens '())
  112. (accesses '())
  113. (for-syntaxes '())
  114. (others '()))
  115. (cond ((null? clauses)
  116. (values opens accesses for-syntaxes (reverse others)))
  117. ((not (list? (car clauses)))
  118. (display "Ignoring invalid define-structures clause")
  119. (newline)
  120. (write (car clauses)) (newline)
  121. (loop (cdr clauses)
  122. opens
  123. accesses
  124. for-syntaxes
  125. others))
  126. (else
  127. (let ((keyword (caar clauses)))
  128. (cond ((compare keyword %open)
  129. (loop (cdr clauses)
  130. (append opens (cdar clauses))
  131. accesses
  132. for-syntaxes
  133. others))
  134. ((compare keyword %access)
  135. (loop (cdr clauses)
  136. opens
  137. (append (cdar clauses) accesses)
  138. for-syntaxes
  139. others))
  140. ((compare keyword %for-syntax)
  141. (loop (cdr clauses)
  142. opens
  143. accesses
  144. (append (cdar clauses) for-syntaxes)
  145. others))
  146. (else
  147. (loop (cdr clauses)
  148. opens
  149. accesses
  150. for-syntaxes
  151. (cons (car clauses) others))))))))))
  152. (lambda (form rename compare)
  153. (let ((names (cadr form))
  154. (clauses (cddr form)))
  155. (call-with-values (lambda ()
  156. (parse-package-clauses clauses rename compare))
  157. (lambda (opens accesses for-syntaxes others)
  158. (let ((%make (rename 'make-a-package))
  159. (%lambda (rename 'lambda))
  160. (%cons (rename 'cons))
  161. (%list (rename 'list))
  162. (%quote (rename 'quote))
  163. (%a-package (rename 'a-package))
  164. (%file-name (rename '%file-name%)))
  165. `(,%make (,%lambda () (,%list ,@opens))
  166. (,%lambda ()
  167. (,%list ,@(map (lambda (a)
  168. `(,%cons (,%quote ,a) ,a))
  169. accesses)))
  170. (,(string->symbol ".make-syntactic-tower.")
  171. (,%quote ,for-syntaxes)
  172. (,%quote ,names)) ; for discloser
  173. ,(string->symbol ".reader.")
  174. (,%file-name)
  175. (,%quote ,others)
  176. (,%quote ,names))))))))
  177. (cons lambda list make-a-package quote make-syntactic-tower %file-name%))
  178. (define-syntax define-reader
  179. (lambda (e r c)
  180. `(,(r 'define) ,(string->symbol ".reader.") ,(cadr e)))
  181. (define))
  182. ; (DEFINE-SYNTACTIC-TOWER-MAKER <proc>)
  183. ; <proc> should be an expression that evaluates to a procedure of
  184. ; two arguments. The first argument is a list of DEFINE-STRUCTURE
  185. ; clauses, and the second is some identifying information (no
  186. ; semantic content). The procedure should return a "reflective
  187. ; tower", which is a promise that returns a pair (<eval-proc> . <env>).
  188. ; To evaluate the right-hand side of a DEFINE-SYNTAX (LET-SYNTAX, etc.)
  189. ; form, <eval-proc> is called on the right-hand side and <env>.
  190. ; Got that?
  191. (define-syntax define-syntactic-tower-maker
  192. (lambda (e r c)
  193. `(,(r 'begin)
  194. (,(r 'define) ,(string->symbol ".make-syntactic-tower.") ,(cadr e))
  195. ;; backwards compatibility for PreScheme compiler
  196. (,(r 'define) ,(string->symbol ".make-reflective-tower.") ,(string->symbol ".make-syntactic-tower."))))
  197. (define))
  198. ;; This now exports everything that could be needed in a new config
  199. ;; package.
  200. (define-syntax export-syntactic-tower-maker
  201. (lambda (e r c)
  202. `(,(r 'export) ,@(map string->symbol '(".make-syntactic-tower."
  203. ".make-reflective-tower."
  204. ".reader."))))
  205. (export))
  206. ;; backwards compatibility
  207. (define-syntax export-reflective-tower-maker
  208. (lambda (e r c)
  209. `(,(r 'export-syntactic-tower-maker)))
  210. (export-syntactic-tower-maker))
  211. ; Modules = package combinators...
  212. (define-syntax define-module
  213. (syntax-rules ()
  214. ((define-module (?name . ?args) ?body ...)
  215. (def ?name (lambda ?args ?body ...)))))