Jean Abou Samra <j...@abou-samra.fr> writes:

> Le 03/06/2022 à 02:32, David Kastrup a écrit :
>> GOOPS was supposed to cause quite a performance hit with Guile 1.8 when
>> used extensively.  It wasn't supposed to do this with Guile 2+ so
>> something like this should be feasible, also for other types:
>>
>> #(use-modules (oop goops))
>>
>> #(define <Moment> (class-of (ly:make-moment 0)))
>>              
>> #(define-method (+ (a <Moment>) (b <Moment>)) (ly:moment-add a b))
>> #(define-method (- (a <Moment>) (b <Moment>)) (ly:moment-sub a b))
>>
>> #(display (- (ly:make-moment 3) (ly:make-moment 4) (ly:make-moment 2)))
>>
>> For those types where manipulation is frequent enough that we defined
>> arithmetic (and possibly other) operators rather than ordinary functions
>> in C++, there may be some point in doing the same in Scheme with
>> generics.
>
>
>
> Nice! I wasn't aware that GOOPS had become faster
> in Guile 2, nor even that it supported smob types.
> I had stayed in the conception that it was a "don't
> use" module.
>
> I'd be in favor of doing this. It will ease writing
> operations on moments and such. What other types could
> use it? Moment and Duration stand as obvious candidates.

I don't think Duration makes a good candidate for arithmetic (you could
implement 2*3/2 as (* (ly:make-duration 1) 3/2) instead of
(ly:make-duration 1 0 3/2) but it seems somewhat contrived.

Pitch would make more sense (there are pitch differences).

-- 
David Kastrup

Reply via email to