(in-package #:fwoar.lisputils) (defmacro with-accessors* ((&rest accessors) object &body body) `(with-accessors ,(ensure-mapping accessors) ,object ,@body)) (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)))))