2017-07-13 6 views
0

goopsライブラリ(http://wiki.call-cc.org/eggref/4/coops)のdefine-genericの目的は何かを理解しようとしています。私はCLOSも知らない)。私はこの方法でクラスやメソッドを定義することができチキンスキームのcoopsオブジェクトシステムのdefine-genericの目的は何ですか

(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)))) 

しかし、これの目的は何ですか?ドキュメントから

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

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

は、一般的な手順、一つ以上の 引数の型に特化した手順を定義します。 ARGUMENT ...正しい メソッドにディスパッチするために使用される、この汎用プロシージャの特化された 引数の数を定義します。ジェネリックプロシージャは追加の引数を受け取るかもしれませんが、 はそれらのメソッドの決定には使用されません。

誰かが、define-methoddefine-genericの違いを説明する簡単な例を教えてください。

答えて

2

汎用プロシージャは、(1つまたは複数の)特殊メソッドからなる特別な種類のオブジェクトです。

define-genericはそのようなオブジェクトを定義し、define-methodはメソッドを追加し、存在しなければ作成します。

+1

これは当てはまります。 'define-generic'の主な使い方は、ジェネリックプロシージャが存在すると宣言したいが、それについての実装がまだない場合です。基本的には、抽象基本クラスのように不完全なAPIを定義することができます。 'define-generic'はジェネリックプロシージャが存在することを保証しますので、" unbound variable "エラーは発生しません。 'define-generic'を宣言するために' define-generic'を使わなかったとしても、 'define-method'が動作するという事実は便宜上のものです。 – sjamaan

関連する問題