2017-07-13 3 views
0

J'essaie de comprendre quel est le but de define-generic dans goops library (http://wiki.call-cc.org/eggref/4/coops), c'est similaire à CLOS s'il peut aider quelqu'un (Je ne connais pas CLOS non plus).Quel est le but de define-generic dans le système d'objet coops dans Chicken Scheme

Je peux définir une classe et une méthode de cette façon:

(define-class <complex>() (x y)) 

(define-method (sum (a <complex>) (b <complex>)) 
    (make <complex> 
    'x (+ (slot-value a 'x) (slot-value b 'x)) 
    'y (+ (slot-value a 'y) (slot-value b 'y)))) 

Mais quel est le but de tout cela?

(define-generic (sum <complex> <complex>)) 

De la documentation:

[syntax] (define-generic (NAME ARGUMENT ...)) 

définit une procédure générique, une procédure spécialisée pour un ou plusieurs types d'arguments. ARGUMENT ... définit le nombre d'arguments spécialisés que cette procédure générique doit utiliser pour envoyer la méthode correcte . La procédure générique peut recevoir des arguments supplémentaires, mais ceux-ci ne seront pas utilisés pour déterminer la méthode.

Quelqu'un pourrait-il me donner un exemple simple expliquant les différences Beetween define-method et define-generic?

Répondre

2

Une procédure générique est un type spécial d'objet qui consiste en une (ou plusieurs) méthodes spécialisées.

define-generic définit un tel objet, et define-method ajoute des méthodes, en le créant s'il n'existe pas.

+1

Cela est vrai. L'utilisation principale de 'define-generic' est si vous voulez déclarer qu'une procédure générique est censée exister, mais vous n'avez pas encore d'implémentation pour cela. Fondamentalement, vous pouvez définir une API éventuellement incomplète avec ceci, tout comme une classe de base abstraite: 'define-generic' s'assure que la procédure générique existe, donc vous n'obtiendrez pas une erreur de type" variable non liée ". Le fait que 'define-method' fonctionne même si vous n'avez pas utilisé' define-generic' d'abord pour déclarer que c'est juste pour plus de commodité. – sjamaan