git.fiddlerwoaroof.com
clos-helpers.lisp
e143b109
 (in-package #:fwoar.lisputils)
 
 (defmacro with-accessors* ((&rest accessors) object &body body)
   `(with-accessors ,(ensure-mapping accessors) ,object
      ,@body))
c67ed088
 
 (defmacro new (class &rest initializer-syms)
   (multiple-value-bind (required optional rest) (parse-ordinary-lambda-list initializer-syms)
     (when optional
       (error "new doesn't handle optional arguments"))
     (if rest
         `(make-instance ,class
                         ,@(mapcan (serapeum:op (list (alexandria:make-keyword _1) _1))
                                   required)
                         ,(make-keyword rest) ,rest)
         `(make-instance ,class
                         ,@(mapcan (serapeum:op (list (alexandria:make-keyword _1) _1))
                                   initializer-syms)))))
 
 (defun-ct %constructor-name (class)
   (format nil "~a-~a" '#:make class))
 
 (defmacro make-constructor (class &rest args)
   (destructuring-bind (class &optional (constructor-name (intern (%constructor-name class))))
       (ensure-list class)
     `(defgeneric ,constructor-name (,@args)
        (:method (,@args)
          (new ',class ,@args)))))