changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/std/mop.lisp

changeset 698: 96958d3eb5b0
parent: a36280d2ef4e
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
384
8fe057887c17 skel refactor1
Richard Westhaver <ellis@rwest.io>
parents: 292
diff changeset
1
 ;;; std/mop.lisp --- Standard MOP Utilities
291
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;;
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;;; Code:
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 (in-package :std/mop)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
 
292
00d1c8afcdbb mostly done with std refactor, added sst-file-writer to rdb
Richard Westhaver <ellis@rwest.io>
parents: 291
diff changeset
8
 ;; make-specializer-form-using-class
00d1c8afcdbb mostly done with std refactor, added sst-file-writer to rdb
Richard Westhaver <ellis@rwest.io>
parents: 291
diff changeset
9
 ;; make-method-lambda-using-specializers
00d1c8afcdbb mostly done with std refactor, added sst-file-writer to rdb
Richard Westhaver <ellis@rwest.io>
parents: 291
diff changeset
10
 
291
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
 (defun list-indirect-class-methods (class)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
12
   "List all indirect methods of CLASS."
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
13
   (remove-duplicates (mapcan #'specializer-direct-generic-functions (compute-class-precedence-list class))))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
14
 
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
15
 (defun list-class-methods (class methods &optional indirect)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
   "List all methods specializing on CLASS modulo METHODS. When INDIRECT is
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
 non-nil, also include indirect (parent) methods."
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
   (if (eq methods t)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
       (if indirect
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
           (list-indirect-class-methods class)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
21
           (specializer-direct-generic-functions class))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
       (mapcar
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
        (lambda (s)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
          (car (member s (specializer-direct-generic-functions class) :key #'generic-function-name)))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
        methods)))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
26
 
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
 ;; FIX 2023-09-13: need exclude param
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
 (defun list-class-slots (class slots &optional exclude)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
29
   ;; should probably convert slot-definition-name here
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
30
   (let ((cs (remove-if
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
31
              (lambda (s)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
32
                (or
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
                 (null s)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
                 (member t (mapcar
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
                            (lambda (x)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
36
                              (string= (slot-definition-name s) x))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
37
                            exclude))))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
              (class-slots class))))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
     (if (eq slots t)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
         cs
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
         (loop for s in slots
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
42
               with sn = (symb s)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
43
               for c in cs
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
44
               with cn = (symb (slot-definition-name c))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
               when (eq sn cn)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
                 collect c))))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
 
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
 ;; TODO 2023-09-09: slot exclusion from dynamic var
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
49
 (defun list-slot-values-using-class (class obj slots &optional nullp unboundp)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
50
   (remove-if
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
51
    #'null
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
52
    (mapcar
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
53
     (lambda (s)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
54
       (let ((n (slot-definition-name s)))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
55
         (let ((ns (make-keyword (symbol-name n))))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
56
           (if (slot-boundp-using-class class obj s)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
57
               (let ((v (slot-value-using-class class obj s)))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
58
                 (if nullp
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
59
                     `(,ns ,v)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
60
                     (unless (null v)
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
61
                       `(,ns ,v))))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
62
               (when unboundp (list ns))))))
a0dfde3cb3c4 begin :STD refactor
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
63
     slots)))
694
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
64
 
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
65
 ;; closer-mop
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
66
 (defun ensure-finalized (class &optional (errorp t))
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
67
   (if (typep class 'class)
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
68
     (unless (class-finalized-p class)
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
69
       (finalize-inheritance class))
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
70
     (when errorp (error "~S is not a class." class)))
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
71
   class)
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
72
 
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
73
 (defun subclassp (class superclass)
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
74
   (flet ((get-class (class) (etypecase class
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
75
                               (class class)
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
76
                               (symbol (find-class class)))))
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
77
 
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
78
       (loop with class = (get-class class)
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
79
             with superclass = (get-class superclass)
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
80
 
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
81
             for superclasses = (list class)
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
82
             then (set-difference
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
83
                   (union (class-direct-superclasses current-class) superclasses)
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
84
                   seen)
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
85
 
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
86
             for current-class = (first superclasses)
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
87
 
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
88
             while current-class
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
89
 
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
90
             if (eq current-class superclass) return t
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
91
             else collect current-class into seen
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
92
 
Richard Westhaver <ellis@rwest.io>
parents: 384
diff changeset
93
             finally (return nil))))