ssql

foops.scm at tip
Login

File foops.scm from the latest check-in


(module foops

(make-object derive-object)

(import scheme (chicken base) (chicken syntax) matchable)
(import-for-syntax (chicken syntax) srfi-1)

(define-for-syntax args-without-self 
  '(if (and (pair? args) (procedure? (car args)))
       (cdr args)
       args))

(define-syntax derive-object
  (ir-macro-transformer
   (lambda (x i c)
     (let-optionals (second x)
         ((ancestor #f)
          (self #f)
          (super #f))
       
       `(let ((ancestor ,ancestor))
          (letrec ((self (lambda args
                           (if (null? args)
                               ancestor
                               (let* ((self* (if (and (pair? args) (procedure? (car args)))
                                                 (car args)
                                                 self))
                                      ,@(if self `((,self self*)) '())
                                      ,@(if super
                                            `((,super
                                               (lambda args
                                                 (apply ancestor self* args))))
                                            '())
                                      (args ,args-without-self))
                               
                                 (match args
                                   ,@(map (lambda (m)
                                            `(((quote ,(caar m)) . ,(cdar m))
                                              . ,(cdr m)))
                                          (cddr x))
                                   (_ (apply ancestor self* args))))))))
            self))))))

(define-syntax make-object
  (ir-macro-transformer
   (lambda (x i r)
     `(derive-object 
       ((lambda args 
          (error "message not understood" ,args-without-self))
        . ,(cadr x))
       . ,(cddr x)))))

)