]> git.leonardobizzoni.com Git - ObjectOriented-Prolog-Lisp/commitdiff
Iniziato la `def-class`
authorLeonardoBizzoni <leo2002714@gmail.com>
Sat, 30 Dec 2023 15:29:27 +0000 (16:29 +0100)
committerLeonardoBizzoni <leo2002714@gmail.com>
Sat, 30 Dec 2023 15:29:27 +0000 (16:29 +0100)
Lisp/README.org
Lisp/ool.lisp

index 537f03e79dac5628f0a52f2398b659c17eb18e8d..5aa1b1ae6d8b3c7a221183477274fd366c4e60f7 100644 (file)
 
 
 *** Implementazione
-#+begin_src lisp :tangle ool.lisp
+#+begin_src elisp :tangle ool.lisp
 ;;;; <Cognome> <Nome> <Matricola>
 ;;;; <eventuali collaborazioni>
 
-(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
 
 *** 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
index 7452b84ce92b1f8db29d599efa06ad1ac586175d..a5ce16286536e555c8f96db6ecc36a9061fe7f83 100644 (file)
@@ -1,10 +1,32 @@
 ;;;; <Cognome> <Nome> <Matricola>
 ;;;; <eventuali collaborazioni>
 
-(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*))