From: LeonardoBizzoni Date: Sat, 30 Dec 2023 15:29:27 +0000 (+0100) Subject: Iniziato la `def-class` X-Git-Url: http://git.leonardobizzoni.com/?a=commitdiff_plain;h=a9e1bd3ebfd4660237c845195e0db25d41ab9809;p=ObjectOriented-Prolog-Lisp Iniziato la `def-class` --- diff --git a/Lisp/README.org b/Lisp/README.org index 537f03e..5aa1b1a 100644 --- a/Lisp/README.org +++ b/Lisp/README.org @@ -10,11 +10,25 @@ *** Implementazione -#+begin_src lisp :tangle ool.lisp +#+begin_src elisp :tangle ool.lisp ;;;; ;;;; -(write-line "Incredibile definizione del predicato `def_class`") +(defun def-class (classname parents &optional (fields nil) (methods nil)) + (defun make-class (parents fields methods) + (let ((class (list :parents parents + :fields (cdr fields) + :methods (cdr methods)))) + (if (null parents) class (inherit class parents)))) + + (cond ((not (listp parents)) (error "`parents` non è una lista")) + ((not (listp fields)) (error "`fields` non è una lista")) + ((not (listp methods)) (error "`methods` non è una lista")) + ((or (null classname) + (not (symbolp classname))) (error "`classname` non è un simbolo"))) + (add-class-spec classname (setf (symbol-value classname) + (make-class parents fields methods))) + classname) #+end_src *** Esempio pratico @@ -26,7 +40,6 @@ *** Implementazione #+begin_src lisp :tangle ool.lisp -(write-line "Incredibile definizione del predicato `make`") #+end_src *** Esempio pratico @@ -38,7 +51,6 @@ *** Implementazione #+begin_src lisp :tangle ool.lisp -(write-line "Incredibile definizione del predicato `field`") #+end_src *** Esempio pratico @@ -49,10 +61,18 @@ *** Implementazione #+begin_src lisp :tangle ool.lisp -(write-line "Incredibile definizione del predicato `fields`") #+end_src *** Esempio pratico * Predicati helper +#+begin_src lisp :tangle ool.lisp +(defparameter *classes-specs* (make-hash-table)) + +(defun add-class-spec (name class-spec) + (setf (gethash name *classes-specs*) class-spec)) + +(defun class-spec (name) + (gethash name *classes-specs*)) +#+end_src diff --git a/Lisp/ool.lisp b/Lisp/ool.lisp index 7452b84..a5ce162 100644 --- a/Lisp/ool.lisp +++ b/Lisp/ool.lisp @@ -1,10 +1,32 @@ ;;;; ;;;; -(write-line "Incredibile definizione del predicato `def_class`") +(defun def-class (classname parents &optional (fields nil) (methods nil)) + (defun make-class (parents fields methods) + (let ((class (list :parents parents + :fields (cdr fields) + :methods (cdr methods)))) + (if (null parents) class (inherit class parents)))) -(write-line "Incredibile definizione del predicato `make`") + (cond ((not (listp parents)) (error "`parents` non è una lista")) + ((not (listp fields)) (error "`fields` non è una lista")) + ((not (listp methods)) (error "`methods` non è una lista")) + ((or (null classname) + (not (symbolp classname))) (error "`classname` non è un simbolo"))) + (add-class-spec classname (setf (symbol-value classname) + (make-class parents fields methods))) + classname) -(write-line "Incredibile definizione del predicato `field`") -(write-line "Incredibile definizione del predicato `fields`") + + + + + +(defparameter *classes-specs* (make-hash-table)) + +(defun add-class-spec (name class-spec) + (setf (gethash name *classes-specs*) class-spec)) + +(defun class-spec (name) + (gethash name *classes-specs*))