t-record.scm 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. ; -*- Mode: Scheme; Syntax: Scheme; Package: Scheme; -*-
  2. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  3. ; Authors: Richard Kelsey, Jonathan Rees
  4. ; This is file t-record.scm.
  5. ; Synchronize any changes with the other *record.scm files.
  6. ;;;; Records
  7. (define make-record-type
  8. (let ((make-stype (*value t-standard-env 'make-stype))
  9. (crawl-exhibit (*value t-standard-env 'crawl-exhibit))
  10. (exhibit-structure (*value t-standard-env 'exhibit-structure))
  11. (structure-type (*value t-standard-env 'structure-type))
  12. (object-hash (*value t-standard-env 'object-hash))
  13. (print (*value t-standard-env 'print))
  14. (format (*value t-standard-env 'format)))
  15. (lambda (id names)
  16. (letrec ((rtd
  17. (make-stype id names
  18. (#[syntax object] #f
  19. ((crawl-exhibit self)
  20. (exhibit-structure self))
  21. ((print self port)
  22. (format port "#{Record~_~S~_~S}" id (object-hash self)))
  23. ((structure-type self) rtd)))))
  24. rtd))))
  25. (define record-predicate (*value t-standard-env 'stype-predicator))
  26. (define record-accessor (*value t-standard-env 'stype-selector))
  27. (define (record-modifier rtd name)
  28. (setter (record-accessor rtd name)))
  29. (define (record-constructor rtd names)
  30. (let ((number-of-inits (length names))
  31. (modifiers (map (lambda (name) (record-modifier rtd name))
  32. names))
  33. (make ((*value t-implementation-env 'stype-constructor) rtd)))
  34. (lambda values
  35. (let ((record (make)))
  36. (let loop ((vals values)
  37. (ups modifiers))
  38. (cond ((null? vals)
  39. (if (null? ups)
  40. record
  41. (error "too few arguments to record constructor"
  42. values type-id names)))
  43. ((null? ups)
  44. (error "too many arguments to record constructor"
  45. values type-id names))
  46. (else
  47. ((car ups) record (car vals))
  48. (loop (cdr vals) (cdr ups)))))))))
  49. (define (define-record-discloser rtd proc) 'unimplemented)