summaryrefslogtreecommitdiff
path: root/misc/leaf-classes.lisp
diff options
context:
space:
mode:
authorNathan Ringo <nathan@remexre.com>2024-11-18 00:34:23 -0600
committerNathan Ringo <nathan@remexre.com>2024-11-18 00:34:23 -0600
commit943a6597b2bcd1b3ed208458a5cba61ad5b4051c (patch)
treed0acf34996941417aca241f5f01e399aaa90af39 /misc/leaf-classes.lisp
parent57331ba9756df043b5c665aa4952a0a7b38799e5 (diff)
...
Diffstat (limited to 'misc/leaf-classes.lisp')
-rw-r--r--misc/leaf-classes.lisp27
1 files changed, 27 insertions, 0 deletions
diff --git a/misc/leaf-classes.lisp b/misc/leaf-classes.lisp
new file mode 100644
index 0000000..711890f
--- /dev/null
+++ b/misc/leaf-classes.lisp
@@ -0,0 +1,27 @@
+(in-package :cl-user)
+
+(defun class-in-cl-package (class)
+ (eql (symbol-package (class-name class)) (find-package 'cl)))
+
+(defun class-has-no-standard-subclasses (class)
+ (notany #'class-in-cl-package (sb-mop:class-direct-subclasses class)))
+
+(let ((queue nil)
+ (set nil))
+ (do-external-symbols (sym 'cl)
+ (let ((class (find-class sym nil)))
+ (when class
+ (push class queue))))
+ (loop
+ while queue
+ do (let ((class (pop queue)))
+ (cond
+ ((class-has-no-standard-subclasses class)
+ (push class set)))))
+ (flet ((name (class)
+ (symbol-name (class-name class))))
+ (setf set (stable-sort set #'string-lessp :key #'name))
+ (setf set (remove-duplicates set :key #'class-name)))
+ (loop
+ for class in set
+ do (format t "~a~%" class)))