*** Implementazione
#+begin_src lisp :tangle ool.lisp
(defun field (instance field-name)
+ (unless (listp instance)
+ (error "~A non è un instanza") instance)
(field-helper (getf instance :fields) field-name))
(defun field-helper (fields field-name)
(defun field* (instance &rest fields)
(cond ((null fields) nil)
((null (cdr fields)) (field instance (car fields)))
- ((null (field instance (car fields))) nil)
- (T (field* instance (cdr fields)))))
+ (T (field* (field instance (car fields)) (cdr fields)))))
#+end_src
*** Esempio pratico
(copy-list (class-spec classname))))
(defun field (instance field-name)
+ (unless (listp instance)
+ (error "~A non è un instanza") instance)
(field-helper (getf instance :fields) field-name))
(defun field-helper (fields field-name)
(defun field* (instance &rest fields)
(cond ((null fields) nil)
((null (cdr fields)) (field instance (car fields)))
- ((null (field instance (car fields))) nil)
- (T (field* instance (cdr fields)))))
+ (T (field* (field instance (car fields)) (cdr fields)))))
(defparameter *classes-specs* (make-hash-table))
(defun field-name-exists (name fields)
(if (null fields)
nil
- (or (eq name (first (first fields)))
+ (or (equal name (first (first fields)))
(field-name-exists name (rest fields)))))
(defun create-instance (listclass new-fields)