next up previous
Next: 14.3 Instance生成 Up: 14 オブジェクト指向機能の実現 Previous: 14.1 クラスの実現

14.2 メソッドの実現

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

(defmacro defmethod (class-name &rest params&body)
  (let
      ((method-names (mapcar #'car params&body))
       (params (mapcar #'cadr params&body))
       (bodies (mapcar #'cddr params&body)))
    `(progn
       (mapcar
        #'(lambda (method-name params body)
            (define-method
              ',class-name
              method-name
              params
              body))
        ',method-names ',params ',bodies)
       ',class-name)))
;;;
(defun define-method (class-name method-name params body)
  (let
      ((fun `(lambda ,(cons 'self params)
               ,@body)))
    (store-method method-name class-name fun)))
(defun store-method (method-name class-name fun)
  (if *verbose*
      (format t "; method ~a defined for ~a.~%"
              method-name class-name))
  (setf (gethash method-name
                 (class-functions (get-class class-name)))
        fun))


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