git.fiddlerwoaroof.com
Raw Blame History
(in-package  :fwoar.rss-reader.utils)

(defmacro defclass+ (name (&rest super) &body (direct-slots &rest options))
  (let ((initargs (append (mapcan (lambda (class)
                                    (typecase class
                                      (cons (cadr class))
                                      (t nil)))
                                  super)
                          (mapcan (lambda (slot)
                                    (alexandria:ensure-list
                                     (alexandria:when-let ((initarg (getf (cdr slot)
                                                                          :initarg)))
                                       (make-symbol (symbol-name initarg)))))
                                  direct-slots))))
    `(progn (defclass ,name
                ,(mapcar (lambda (it)
                           (typecase it
                             (cons (car it))
                             (t it)))
                  super)
              ,direct-slots
              ,@options)
            (defun ,name (,@initargs)
              (fw.lu:new ',name ,@initargs)))))