Next: methods concrete fields, Up: methods concrete [Contents][Index]
The clause method allows the definition of overloaded
functions, with multiple function specialisations associated to the same
method name. Example:
(define-record-type <alpha>
(fields a b)
(method ({doit <list>} {A <fixnum>})
(list (.a this) (.b this) 'fixnum A))
(method ({doit <list>} {A <symbol>})
(list (.a this) (.b this) 'symbol A))
(method ({doit <list>} {A <number>} {B <number>})
(list (.a this) (.b this) 'numbers A B)))
(define O
(new <alpha> 1 2))
(.doit O 123) ⇒ (1 2 fixnum 123)
(.doit O 'ciao) ⇒ (1 2 symbol ciao)
(.doit O 3 4) ⇒ (1 2 numbers 3 4)
we can think of the methods defined above as expanding to the following definitions:
(define/overload ({doit <list>} {subject <alpha>}
{A <fixnum>})
(fluid-let-syntax ((this (make-synonym-transformer #'subject)))
(list (.a this) (.b this) 'fixnum A)))
(define/overload ({doit <list>} {subject <alpha>}
{A <symbol>})
(fluid-let-syntax ((this (make-synonym-transformer #'subject)))
(list (.a this) (.b this) 'symbol A)))
(define/overload ({doit <list>} {subject <alpha>}
{A <number>} {B <number>})
(fluid-let-syntax ((this (make-synonym-transformer #'subject)))
(list (.a this) (.b this) 'numbers A B)))
where subject is a non–accessible identifier.