(define-syntax (define-class name-and-members . body) "Macro for creating simple classes." (let ((name (first name-and-members)) (members (rest name-and-members))) `(set-type! (define ;; The function definition (,(string->symbol (concat-strings "make-" (symbol->string name))) ,@members) ;; The docstring ,(concat-strings "This is the handle to an object of the class " (symbol->string name)) ;; the body ,@body (let ,(zip members members) (set-type! (lambda args "This is the docs for the handle" (let ((op (eval (first args)))) (if (procedure? op) (eval args) (eval (first args))))) ,(symbol->keyword name)))) :constructor))) (define-syntax (-> obj meth . args) `(,obj ',meth ,@args))