(defun inherit (class parents)
(if (null parents)
class
- (inherit (merge-class class (class-spec (car parents)))
- (cdr parents))))
+ (if (is-class (car parents))
+ (inherit (merge-class class (class-spec (car parents)))
+ (cdr parents))
+ (error "`~A` non è una classe" (car parents)))))
(defun merge-class (child super)
(list :parents (merge-parents (getf super :parents)
(getf child :parents))
:fields (merge-parts (getf super :fields)
- (getf child :fields))
+ (getf child :fields))
:methods (merge-parts (getf super :methods)
- (getf child :methods))))
+ (getf child :methods))))
#+end_src
**** Merge dei genitori delle superclassi con quelli della classe figlio
(or (equal name (first (first fields)))
(field-name-exists name (rest fields)))))
#+end_src
+
+** Stabilire se un simbolo è una classe
+#+begin_src lisp :tangle ool.lisp
+(defun is-class (name)
+ (if (class-spec name) t nil))
+#+end_src
(defun inherit (class parents)
(if (null parents)
class
- (inherit (merge-class class (class-spec (car parents)))
- (cdr parents))))
+ (if (is-class (car parents))
+ (inherit (merge-class class (class-spec (car parents)))
+ (cdr parents))
+ (error "`~A` non è una classe" (car parents)))))
(defun merge-class (child super)
(list :parents (merge-parents (getf super :parents)
(getf child :parents))
:fields (merge-parts (getf super :fields)
- (getf child :fields))
+ (getf child :fields))
:methods (merge-parts (getf super :methods)
- (getf child :methods))))
+ (getf child :methods))))
(defun merge-parents (super-parents child-parent)
(if (null super-parents)
nil
(or (equal name (first (first fields)))
(field-name-exists name (rest fields)))))
+
+(defun is-class (name)
+ (if (class-spec name) t nil))