(module call-table-generics ;;© Idiomdrottning, 2021. BSD 1-clause license (define-generic) (import scheme (chicken base) (chicken syntax) (only brev-separate define-ir-syntax*)) (import-for-syntax (only brev-separate call-table*) matchable) (define-for-syntax gentable (call-table*)) (define-ir-syntax* (define-generic (name . preds+bindings) . body) (gentable (strip-syntax name) (cons preds+bindings body)) (let ((bindings (map (lambda (a) (if (pair? a) (cadr a) a)) preds+bindings))) `(define (,name ,@bindings) (cond ,@(map (lambda (el) (cons (let ((clause (car el))) (if (< 1 (length clause)) (cons 'and clause) (car clause))) (cdr el))) (gentable (strip-syntax name))))))))