next up previous
Next: 15.4 Instance生成 Up: 15 CLOSのクラスシステムの実現 Previous: 15.2 クラス定義の実現

15.3 メソッドの実現

メソッド定義はクラスを表現する構造体のfunctionsスロットに 蓄えられます.

(defmacro defmethod* (method-name param-list &rest body)
  (let* ((cls-name (cadr (car param-list)))
         (params (cons (caar param-list)
                       (cdr param-list))))
    `(define-method ',cls-name
                    ',method-name ',params ',body)))

(defun define-method (cls-name method-name params body)
  (let ((fun `(lambda ,params ,@body)))
    (store-method method-name cls-name fun))
  (create-generic-function method-name))

(defun store-method (method-name cls-name fun)
  (if *verbose*
      (format t "; method ~a defined for ~a.~%"
              method-name cls-name))
  (setf (gethash method-name
                 (cls-functions (get-class cls-name)))
    fun)
  )

(defun create-generic-function (method-name)
  (setf
   (symbol-function method-name)
   (eval
    `(function
      (lambda (self &rest params)
        (apply
         (find-method* ',method-name 
                       (send self 'class))
         (cons self params)))))))


generated through LaTeX2HTML. M.Inaba 平成18年5月6日