external-enum-type.scm 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Mike Sperber
  3. (define-syntax define-external-enum-type-with-unknowns
  4. (syntax-rules ()
  5. ((define-external-enum-type-with-unknowns
  6. ?type-name
  7. (?enumerand ...) ; The C code knows about the order
  8. ?unknown-type-name ?:unknown-type-name
  9. ?make-unknown ?unknown-predicate? ?unknown-accessor
  10. ?offset ; C code knows this
  11. ?predicate? ?->raw ?raw->)
  12. (begin
  13. (define-record-type ?unknown-type-name ?:unknown-type-name
  14. (?make-unknown number)
  15. ?unknown-predicate?
  16. (number ?unknown-accessor))
  17. (define-record-discloser ?:unknown-type-name
  18. (lambda (r)
  19. (list '?unknown-type-name
  20. (?unknown-accessor r))))
  21. (define-enumeration ?type-name
  22. (?enumerand ...)
  23. set)
  24. (define all (enum-set-complement (set)))
  25. (define index (enum-set-indexer all))
  26. (define set-type (enum-set-type all))
  27. (define (?predicate? thing)
  28. (or (and (symbol? thing)
  29. (enum-set-member? thing all))
  30. (?unknown-predicate? thing)))
  31. (define (?->raw val)
  32. (if (?unknown-predicate? val)
  33. (+ (?unknown-accessor val) ?offset)
  34. (index val)))
  35. (define (?raw-> raw)
  36. (if (>= raw ?offset)
  37. (?make-unknown (- raw ?offset))
  38. (vector-ref (enum-set-type-values set-type) raw)))
  39. ))))