|
@@ -7,10 +7,13 @@
|
7
|
7
|
(defmacro do-subclasses ((var class) &body body)
|
8
|
8
|
"Iterate over the subclasses of CLASS performing BODY with VAR
|
9
|
9
|
lexically bound to the current subclass' class-name."
|
10
|
|
- (alexandria:with-gensyms (klass klasses)
|
11
|
|
- `(let* ((,klass (if (typep ,class 'class) ,class (find-class ',class)))
|
12
|
|
- (,klasses (closer-mop:class-direct-subclasses ,klass)))
|
13
|
|
- (loop for ,var in ,klasses do ,@body))))
|
|
10
|
+ (alexandria:with-gensyms (klasses all-subclasses)
|
|
11
|
+ `(labels ((,all-subclasses (class)
|
|
12
|
+ (let ((subclasses (closer-mop:class-direct-subclasses class)))
|
|
13
|
+ (append subclasses (loop for subclass in subclasses
|
|
14
|
+ nconc (,all-subclasses subclass))))))
|
|
15
|
+ (let ((,klasses (,all-subclasses (find-class ',class))))
|
|
16
|
+ (loop for ,var in ,klasses do ,@body)))))
|
14
|
17
|
|
15
|
18
|
(defun fmt (fmt-str args)
|
16
|
19
|
"A convenient FORMAT interface for string building."
|