Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions derive/equality.lisp
Original file line number Diff line number Diff line change
@@ -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))))))
18 changes: 18 additions & 0 deletions derive/print-object.lisp
Original file line number Diff line number Diff line change
@@ -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 ">"))))))
30 changes: 30 additions & 0 deletions derive/readers.lisp
Original file line number Diff line number Diff line change
@@ -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))))))
8 changes: 8 additions & 0 deletions meta-definitions.derive.equality.asd
Original file line number Diff line number Diff line change
@@ -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")))
8 changes: 8 additions & 0 deletions meta-definitions.derive.print-object.asd
Original file line number Diff line number Diff line change
@@ -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")))
8 changes: 8 additions & 0 deletions meta-definitions.derive.readers.asd
Original file line number Diff line number Diff line change
@@ -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")))
8 changes: 8 additions & 0 deletions meta-definitions.derives.asd
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
(in-package :cl-user)

(asdf:defsystem #:meta-definitions.derives
:license "Unlicense"
:author "Bruno Dias"
:depends-on (#:meta-definitions.derive.readers
#:meta-definitions.derive.print-object
#:meta-definitions.derive.equality))
70 changes: 0 additions & 70 deletions package.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
(:export
#:declarations
#:define-class
#:derive-readers
#:derive-print-object
#:derive-equality
#:define-from
#:define))

Expand Down Expand Up @@ -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)
Expand Down
10 changes: 5 additions & 5 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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)
```

Expand Down