front-end.scm 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey
  3. (define (prescheme-front-end package-ids spec-files copy no-copy shadow)
  4. (receive (packages exports lookup)
  5. (package-specs->packages+exports package-ids spec-files)
  6. (let ((forms (flatten-definitions (scan-packages packages))))
  7. (annotate-forms! (car package-ids) lookup exports copy no-copy shadow)
  8. (receive (forms producer)
  9. (sort-forms forms)
  10. (format #t "Checking types~%")
  11. (let ((sorted (let loop ((forms '()))
  12. (cond ((producer)
  13. => (lambda (f)
  14. (type-check-form f)
  15. (loop (cons f forms))))
  16. (else
  17. (reverse forms))))))
  18. ; (format #t "Adding coercions~%")
  19. ; (add-type-coercions (form-reducer forms))
  20. sorted)))))
  21. (define (form-reducer forms)
  22. (lambda (proc init)
  23. (let loop ((forms forms) (value init))
  24. (if (null? forms)
  25. value
  26. (loop (cdr forms)
  27. (proc (form-name (car forms))
  28. (form-value (car forms))
  29. value))))))
  30. (define (test id files)
  31. ((structure-ref node reset-node-id))
  32. ((structure-ref record-types reset-record-data!))
  33. (prescheme-front-end id files '() '() '()))
  34. (define (annotate-forms! package-id lookup exports copy no-copy shadow)
  35. (mark-forms! exports
  36. lookup
  37. (lambda (f) (set-form-exported?! f #t))
  38. "exported")
  39. (mark-forms! copy
  40. lookup
  41. (lambda (f) (set-form-integrate! f 'yes))
  42. "to be copied")
  43. (mark-forms! no-copy
  44. lookup
  45. (lambda (f) (set-form-integrate! f 'no))
  46. "not to be copied")
  47. (for-each (lambda (data)
  48. (let ((owner (package-lookup lookup (caar data) (cadar data))))
  49. (if owner
  50. (mark-forms! (cdr data)
  51. lookup
  52. (lambda (f)
  53. (set-form-shadowed! owner
  54. (cons (form-var f)
  55. (form-shadowed owner))))
  56. (format #f "shadowed in ~S" (car data)))
  57. (format #t "Warning: no definition for ~S, cannot shadow ~S~%"
  58. (car data) (cdr data)))))
  59. shadow))
  60. (define (mark-forms! specs lookup marker mark)
  61. (let ((lose (lambda (p n)
  62. (format #t "Warning: no definition for ~S, cannot mark as ~A~%"
  63. (list p n) mark))))
  64. (for-each (lambda (spec)
  65. (let ((package-id (car spec))
  66. (ids (cdr spec)))
  67. (for-each (lambda (id)
  68. (cond ((package-lookup lookup package-id id)
  69. => marker)
  70. (else
  71. (lose package-id id))))
  72. ids)))
  73. specs)))
  74. (define (package-lookup lookup package-id id)
  75. (let ((var (lookup package-id id)))
  76. (and (variable? var)
  77. (maybe-variable->form var))))
  78. ; Two possibilities:
  79. ; 1. The variable is settable but the thunk gives it no particular value.
  80. ; 2. A real value is or needs to be present, so we relate the type of
  81. ; the variable with the type of the value.
  82. ; thunk's value may be a STOB and not a lambda.
  83. (define (type-check-form form)
  84. ;; (format #t " ~S: " (variable-name (form-var form)))
  85. (let* ((value (form-value form))
  86. (var (form-var form))
  87. (name (form-name form))
  88. (value-type (cond (((structure-ref nodes node?) value)
  89. (infer-definition-type value (source-proc form)))
  90. ((variable? value)
  91. (get-package-variable-type value))
  92. (else
  93. (bug "unknown kind of form value ~S" value)))))
  94. (set-form-value-type! form value-type)
  95. (cond ((not (variable-set!? var))
  96. (let ((type (cond ((eq? type/unknown (variable-type var))
  97. (let ((type (schemify-type value-type 0)))
  98. (set-variable-type! var type)
  99. type))
  100. (else
  101. (unify! value-type (get-package-variable-type var) form)
  102. value-type))))
  103. (if (not (type-scheme? type))
  104. (make-nonpolymorphic! type)) ; lock down any related uvars
  105. ;;(format #t "~S~%" (instantiate type))
  106. ))
  107. ((not (or (eq? type/unit value-type)
  108. (eq? type/null value-type)))
  109. (make-nonpolymorphic! value-type) ; no polymorphism allowed (so it
  110. ;; is not checked for, so there may be depth 0 uvars in the type)
  111. ;; (format #t " ~S~%" (instantiate value-type))
  112. (unify! value-type (get-package-variable-type var) form))
  113. ((eq? type/unknown (variable-type var))
  114. (get-package-variable-type var)))))
  115. (define (source-proc form)
  116. (lambda (port)
  117. (write-one-line port
  118. 70
  119. (lambda (port)
  120. (format port "~S = ~S"
  121. (form-name form)
  122. ((structure-ref nodes schemify)
  123. (form-value form)))))))