t-record.scm 1.8 KB

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