|
- (define-syntax (define-class name members :rest body)
- "Macro for creating classes."
- (define (underscore sym)
- (string->symbol (concat-strings "_" (symbol->string sym))))
-
- (define underscored-members (map underscore members))
-
- ;; the wrapping let environment
- (define let-body `(let ,(zip members underscored-members)))
-
- ;; the body
- (extend let-body body)
- ;; (map (lambda (fun) (append let-body fun)) body)
-
- ;; the dispatch function
- (append let-body `(set-type
- (special-lambda
- (message :rest args)
- "This is the docs for the handle"
- (eval (extend (list message) args))) ,(symbol->keyword name)))
-
- ;; stuff it all in the constructor function
- `(define
- ;; The function definition
- ,(pair (string->symbol (concat-strings "make-" (symbol->string name))) underscored-members)
- ;; The docstring
- ,(concat-strings "This is the handle to an object of the class " (symbol->string name))
- ;; the body
- ,let-body))
|