*** 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
*** Implementazione
#+begin_src lisp :tangle ool.lisp
-(write-line "Incredibile definizione del predicato `make`")
#+end_src
*** Esempio pratico
*** 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
;;;; <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*))