guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

merge-generics


From: Thomas Wawrzinek
Subject: merge-generics
Date: Fri, 24 Aug 2001 09:29:32 +0200 (MEST)

Hi!

Out of curiosity, I implemented Marius' proposal for a merge-generics
function. I'm sure this can be improved a lot, but maybe it's of interest to
some.

Regards,

                                Thomas

(define-module (a)
  :use-module (oop goops))

(define-method (foo (o <vector>))
  (display "VECTOR ") (display o) (newline))

(define-method (foo (o <string>))
  (display "STRING ") (display o) (newline))

(export foo)

(define-module (b)
  :use-module (oop goops))

(define-method (foo (o <list>))
  (display "LIST ") (display o) (newline))

(export foo)

(define-module (merger)
  :use-module (oop goops))

(define (merge-generics . args)
  (let ((f (make-generic)))
    (for-each (lambda (el)
                (if (not (is-a? el <generic>))
                    (error "No generic function."))
                (for-each (lambda (m)
                            (add-method! f m))
                          (generic-function-methods el)))
              args)
    f))

(export merge-generics)

(define-module (main)
  :use-module (oop goops)
  :use-module ((a) :select ((foo . a:foo)))
  :use-module ((b) :select ((foo . b:foo)))
  :use-module (merger))

(define foo (merge-generics a:foo b:foo))

(foo "1 2 3")
(foo #(1 2 3))
(foo '(1 2 3))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]