From ea203fd5a715af58069249de2adf05b428ea8a37 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Apr 2026 00:17:58 +0000 Subject: [PATCH 1/2] feat: move derive-* macros to their own packages under derive/ Agent-Logs-Url: https://github.com/cl-sdk/meta-definitions/sessions/07ae102f-5b1a-458e-96f5-dde9a6f2c277 Co-authored-by: diasbruno <362368+diasbruno@users.noreply.github.com> --- derive/equality.lisp | 37 +++++++++++++++++++ derive/print-object.lisp | 18 ++++++++++ derive/readers.lisp | 30 ++++++++++++++++ meta-definitions.derives.asd | 10 ++++++ package.lisp | 70 ------------------------------------ readme.md | 10 +++--- 6 files changed, 100 insertions(+), 75 deletions(-) create mode 100644 derive/equality.lisp create mode 100644 derive/print-object.lisp create mode 100644 derive/readers.lisp create mode 100644 meta-definitions.derives.asd diff --git a/derive/equality.lisp b/derive/equality.lisp new file mode 100644 index 0000000..4c3ce18 --- /dev/null +++ b/derive/equality.lisp @@ -0,0 +1,37 @@ +(defpackage #:meta-definitions.derive.equality + (:use #:cl) + (:import-from #:meta-definitions #:declarations) + (:export #:derive-equality)) + +(in-package #:meta-definitions.derive.equality) + +(defmacro derive-equality (class-name) + (let ((spec (gethash (symbol-name class-name) declarations))) + (destructuring-bind (class-spec slots-spec) + spec + (declare (ignore class-spec)) + (let* ((slots (cdr slots-spec)) + (check-pairs (mapcar (lambda (slot) + (let* ((slot-name (car slot)) + (attrs (cdr slot)) + (slot-type (getf attrs :type)) + (is-nullable (member 'null (uiop:ensure-list slot-type))) + (eq-fn (getf attrs :equality-fn)) + (slot-eq (if eq-fn eq-fn ''equal)) + (base `(funcall ,slot-eq + (slot-value a ',slot-name) + (slot-value b ',slot-name)))) + (if is-nullable + `(if (and (not (equal (slot-value a ',slot-name) :null)) + (not (equal (slot-value b ',slot-name) :null))) + ,base + (funcall 'equal + (slot-value a ',slot-name) + (slot-value b ',slot-name))) + base))) + slots)) + (eq-name (intern (string-upcase (concatenate 'string (symbol-name class-name) "="))))) + `(progn + (defun ,eq-name (a b) + (and ,@check-pairs)) + (export ',eq-name)))))) diff --git a/derive/print-object.lisp b/derive/print-object.lisp new file mode 100644 index 0000000..8fcb1fe --- /dev/null +++ b/derive/print-object.lisp @@ -0,0 +1,18 @@ +(defpackage #:meta-definitions.derive.print-object + (:use #:cl) + (:import-from #:meta-definitions #:declarations) + (:export #:derive-print-object)) + +(in-package #:meta-definitions.derive.print-object) + +(defmacro derive-print-object (class-name) + "Defines a print-object method for the given class." + (let ((spec (gethash (symbol-name class-name) declarations))) + (destructuring-bind (class-spec slots-spec) + spec + (let* ((slots (mapcar #'car (cdr slots-spec)))) + `(defmethod print-object ((object ,class-name) stream) + (format stream "#<~A~%" ',(caadr class-spec)) + (dolist (slot ',slots) + (format stream " ~A: ~A~%" slot (slot-value object slot))) + (format stream ">")))))) diff --git a/derive/readers.lisp b/derive/readers.lisp new file mode 100644 index 0000000..80ea815 --- /dev/null +++ b/derive/readers.lisp @@ -0,0 +1,30 @@ +(defpackage #:meta-definitions.derive.readers + (:use #:cl) + (:import-from #:meta-definitions #:declarations) + (:export #:derive-readers)) + +(in-package #:meta-definitions.derive.readers) + +(defmacro derive-readers (class-name) + (let ((spec (gethash (symbol-name class-name) declarations))) + (destructuring-bind (class-spec slots-spec) + spec + (declare (ignore class-spec)) + (let ((slots (cdr slots-spec))) + `(progn + ,@(mapcar (lambda (slot) + (destructuring-bind (slot-name &rest attrs) + slot + (declare (ignore attrs)) + (let* ((sym-name (string-upcase + (concatenate + 'string + (symbol-name class-name) + "-" + (symbol-name slot-name)))) + (reader-name (intern sym-name))) + `(progn + (defun ,reader-name (obj) + (slot-value obj ',slot-name)) + (export ',reader-name))))) + slots)))))) diff --git a/meta-definitions.derives.asd b/meta-definitions.derives.asd new file mode 100644 index 0000000..2d12d2f --- /dev/null +++ b/meta-definitions.derives.asd @@ -0,0 +1,10 @@ +(in-package :cl-user) + +(asdf:defsystem #:meta-definitions.derives + :license "Unlicense" + :author "Bruno Dias" + :serial t + :depends-on (#:meta-definitions #:uiop) + :components ((:file "derive/readers") + (:file "derive/print-object") + (:file "derive/equality"))) diff --git a/package.lisp b/package.lisp index 5428387..7a0c570 100644 --- a/package.lisp +++ b/package.lisp @@ -3,9 +3,6 @@ (:export #:declarations #:define-class - #:derive-readers - #:derive-print-object - #:derive-equality #:define-from #:define)) @@ -58,73 +55,6 @@ ,slots) (closer-mop:ensure-finalized (find-class ',(caadr class-spec))))))))) -(defmacro derive-readers (class-name) - (let ((spec (gethash (symbol-name class-name) declarations))) - (destructuring-bind (class-spec slots-spec) - spec - (declare (ignore class-spec)) - (let ((slots (cdr slots-spec))) - `(progn - ,@(mapcar (lambda (slot) - (destructuring-bind (slot-name &rest attrs) - slot - (declare (ignore attrs)) - (let* ((sym-name (string-upcase - (concatenate - 'string - (symbol-name class-name) - "-" - (symbol-name slot-name)))) - (reader-name (intern sym-name))) - `(progn - (defun ,reader-name (obj) - (slot-value obj ',slot-name)) - (export ',reader-name))))) - slots)))))) - -(defmacro derive-print-object (class-name) - "Defines a print-object method for the given class." - (let ((spec (gethash (symbol-name class-name) declarations))) - (destructuring-bind (class-spec slots-spec) - spec - (let* ((slots (mapcar #'car (cdr slots-spec)))) - `(defmethod print-object ((object ,class-name) stream) - (format stream "#<~A~%" ',(caadr class-spec)) - (dolist (slot ',slots) - (format stream " ~A: ~A~%" slot (slot-value object slot))) - (format stream ">")))))) - -(defmacro derive-equality (class-name) - (let ((spec (gethash (symbol-name class-name) declarations))) - (destructuring-bind (class-spec slots-spec) - spec - (declare (ignore class-spec)) - (let* ((slots (cdr slots-spec)) - (check-pairs (mapcar (lambda (slot) - (let* ((slot-name (car slot)) - (attrs (cdr slot)) - (slot-type (getf attrs :type)) - (is-nullable (member 'null (uiop:ensure-list slot-type))) - (eq-fn (getf attrs :equality-fn)) - (slot-eq (if eq-fn eq-fn ''equal)) - (base `(funcall ,slot-eq - (slot-value a ',slot-name) - (slot-value b ',slot-name)))) - (if is-nullable - `(if (and (not (equal (slot-value a ',slot-name) :null)) - (not (equal (slot-value b ',slot-name) :null))) - ,base - (funcall 'equal - (slot-value a ',slot-name) - (slot-value b ',slot-name))) - base))) - slots)) - (eq-name (intern (string-upcase (concatenate 'string (symbol-name class-name) "="))))) - `(progn - (defun ,eq-name (a b) - (and ,@check-pairs)) - (export ',eq-name)))))) - (defmacro define-from (class-name name selected-slots &optional extra-slots) (let ((spec (gethash (symbol-name class-name) declarations))) (destructuring-bind (class-spec slots-spec) diff --git a/readme.md b/readme.md index e1ee5fb..44b5dbe 100644 --- a/readme.md +++ b/readme.md @@ -41,9 +41,9 @@ Meta is library to create infinite types and derivations. ;; :type local-time:timestamp) ;; (deleted-at :type (or local-time:timestamp null)))) -(meta:derive-readers user) -(meta:derive-equality user) -(meta:derive-print-object user) +(meta-definitions.derive.readers:derive-readers user) +(meta-definitions.derive.equality:derive-equality user) +(meta-definitions.derive.print-object:derive-print-object user) ;; create a input type create user @@ -54,8 +54,8 @@ Meta is library to create infinite types and derivations. ;; (defclass create-user () ;; ((name :type string))) -(meta:derive-readers create-user) -(meta:derive-print-object create-user) +(meta-definitions.derive.readers:derive-readers create-user) +(meta-definitions.derive.print-object:derive-print-object create-user) (derive-validation create-user) ``` From b74940fcc11200d4daf0ef689f9c1e7369f9e005 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Apr 2026 00:30:03 +0000 Subject: [PATCH 2/2] feat: add individual .asd system per derive package Agent-Logs-Url: https://github.com/cl-sdk/meta-definitions/sessions/90c11a09-f74f-45f2-94af-cfe1e7b3e3a3 Co-authored-by: diasbruno <362368+diasbruno@users.noreply.github.com> --- meta-definitions.derive.equality.asd | 8 ++++++++ meta-definitions.derive.print-object.asd | 8 ++++++++ meta-definitions.derive.readers.asd | 8 ++++++++ meta-definitions.derives.asd | 8 +++----- 4 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 meta-definitions.derive.equality.asd create mode 100644 meta-definitions.derive.print-object.asd create mode 100644 meta-definitions.derive.readers.asd diff --git a/meta-definitions.derive.equality.asd b/meta-definitions.derive.equality.asd new file mode 100644 index 0000000..e441552 --- /dev/null +++ b/meta-definitions.derive.equality.asd @@ -0,0 +1,8 @@ +(in-package :cl-user) + +(asdf:defsystem #:meta-definitions.derive.equality + :license "Unlicense" + :author "Bruno Dias" + :serial t + :depends-on (#:meta-definitions) + :components ((:file "derive/equality"))) diff --git a/meta-definitions.derive.print-object.asd b/meta-definitions.derive.print-object.asd new file mode 100644 index 0000000..98629d0 --- /dev/null +++ b/meta-definitions.derive.print-object.asd @@ -0,0 +1,8 @@ +(in-package :cl-user) + +(asdf:defsystem #:meta-definitions.derive.print-object + :license "Unlicense" + :author "Bruno Dias" + :serial t + :depends-on (#:meta-definitions) + :components ((:file "derive/print-object"))) diff --git a/meta-definitions.derive.readers.asd b/meta-definitions.derive.readers.asd new file mode 100644 index 0000000..8ccfd0f --- /dev/null +++ b/meta-definitions.derive.readers.asd @@ -0,0 +1,8 @@ +(in-package :cl-user) + +(asdf:defsystem #:meta-definitions.derive.readers + :license "Unlicense" + :author "Bruno Dias" + :serial t + :depends-on (#:meta-definitions) + :components ((:file "derive/readers"))) diff --git a/meta-definitions.derives.asd b/meta-definitions.derives.asd index 2d12d2f..387b97b 100644 --- a/meta-definitions.derives.asd +++ b/meta-definitions.derives.asd @@ -3,8 +3,6 @@ (asdf:defsystem #:meta-definitions.derives :license "Unlicense" :author "Bruno Dias" - :serial t - :depends-on (#:meta-definitions #:uiop) - :components ((:file "derive/readers") - (:file "derive/print-object") - (:file "derive/equality"))) + :depends-on (#:meta-definitions.derive.readers + #:meta-definitions.derive.print-object + #:meta-definitions.derive.equality))