lib/keyword.c (kw_parseempty): Use correct variable scanning `kwval' list.
[sod] / src / utilities.lisp
index 25733e8..9ff9daf 100644 (file)
 ;;;--------------------------------------------------------------------------
 ;;; Locatives.
 
-(export '(loc locp))
-(defstruct (loc (:predicate locp) (:constructor make-loc (reader writer)))
+(export '(locative locativep))
+(defstruct (locative (:predicate locativep)
+                    (:constructor make-locative (reader writer))
+                    (:conc-name loc-))
   "Locative data type.  See `locf' and `ref'."
   (reader nil :type function)
   (writer nil :type function))
       (valtmps valforms newtmps setform getform)
       (get-setf-expansion place env)
     `(let* (,@(mapcar #'list valtmps valforms))
-       (make-loc (lambda () ,getform)
-                (lambda (,@newtmps) ,setform)))))
+       (make-locative (lambda () ,getform)
+                     (lambda (,@newtmps) ,setform)))))
 
 (export 'ref)
 (declaim (inline ref (setf ref)))
    except where overridden by INITARGS."
   (apply #'copy-instance-using-class (class-of object) object initargs))
 
+(export 'find-eql-specialized-method)
+(defun find-eql-specialized-method (function arg object)
+  "Return a method defined on FUNCTION whose ARGth argument is
+   `eql'-specialized on OBJECT."
+  (find-if (lambda (method)
+            (let ((spec (nth arg (method-specializers method))))
+              (and spec
+                   (typep spec 'eql-specializer)
+                   (eq (eql-specializer-object spec) object))))
+          (generic-function-methods function)))
+
 (export '(generic-function-methods method-specializers
          eql-specializer eql-specializer-object))