X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Fkmr-mop.lisp;h=017aa0b2222cdc157cfd1ba391a51567211ee4e6;hp=75ccb5eaa2eacf919f75f5848f66914bd55da5a3;hb=39e2802cd264ddacb3ca59b3b2c5c38f202149de;hpb=f5b49cfe271f8c467f74002eaf27e1d93409cdc5 diff --git a/sql/kmr-mop.lisp b/sql/kmr-mop.lisp index 75ccb5e..017aa0b 100644 --- a/sql/kmr-mop.lisp +++ b/sql/kmr-mop.lisp @@ -66,14 +66,25 @@ #+mop-slot-order-reversed (reverse (class-direct-slots class)) #-mop-slot-order-reversed (class-direct-slots class)) -(defun find-class-slot-by-name (class slot-name &optional direct?) +(defun find-slot-by-name (class slot-name &optional direct? recurse?) "Looks up a direct-slot-definition by name" - (setf class (to-class class)) - (find (to-slot-name slot-name) - (if direct? - (ordered-class-direct-slots class) - (ordered-class-slots class)) - :key #'slot-definition-name)) + (setf class (to-class class) + slot-name (to-slot-name slot-name)) + (labels ((find-it (class) + (let* ((slots (if direct? + (ordered-class-direct-slots class) + (ordered-class-slots class))) + (it (find slot-name + slots + :key #'slot-definition-name))) + (if it + it + (when recurse? + (loop for sup in (class-direct-superclasses class) + for rtn = (find-it sup) + until rtn + finally (return rtn))))))) + (find-it class))) ;; Lispworks has symbol for slot rather than the slot instance (defun %svuc-slot-name (slot)