simple-generic added by dieggsy on Fri Jan 29 22:29:25 2021
(module simple-generic (define-generic
define-method)
(import scheme)
(import-for-syntax (only srfi-1 zip))
(define-syntax define-generic
(syntax-rules ()
((_ name)
(define (name . rest)
(import chicken.base)
(error "No matching methods for args" rest)))))
(define-syntax define-method
(er-macro-transformer
(lambda (x r c)
(let* ((name (caadr x))
(args (cdadr x))
(argnames (map cadr args))
(preds (map car args))
(body (cddr x)))
`(let ((old ,name))
(set! ,name
(lambda ,argnames
(if (and ,@(zip preds argnames))
(begin
,@body)
(old ,@argnames))))))))))