; -*- Mode: Scheme; Syntax: Scheme; Package: bare-machine -*- ; This is file enum.scm. ;;;; Enumerated types ; The expression ; (define-enumeration (*)) ; will (a) define the variable to name an enumerated type, ; and (b) define / ... / to be small ; integers. (define-macro (define-enumeration name cases) `(begin (define ,name ',(list->vector cases)) ,@(do ((c cases (cdr c)) (i 0 (+ i 1)) (d '() (cons `(define ,(concatenate-symbol name '/ (car c)) ,i) d))) ((null? c) (reverse d))))) ; Break the enumerated types abstraction. ; (enumerand->name ) => a symbol ; (name->enumerand ) => an integer (define (enumerand->name e e-type) (vector-ref e-type e)) (define (name->enumerand e e-type) (or (vector-posq e e-type) (error "unknown enumerand name" e)))