]> git.leonardobizzoni.com Git - ObjectOriented-Prolog-Lisp/commitdiff
Iniziato a fare i metodi
authorLeonardoBizzoni <leo2002714@gmail.com>
Wed, 3 Jan 2024 11:13:45 +0000 (12:13 +0100)
committerLeonardoBizzoni <leo2002714@gmail.com>
Wed, 3 Jan 2024 11:13:45 +0000 (12:13 +0100)
Manca ancora la sostituzione dei vari `this` ma la definizione del
"metodo" c'è.

Credo sia necessario trovare un modo per permettere l'esistenza di 2+
funzioni con lo stesso nome perchè ora quando un figlio estende un
metodo del padre questo viene eliminato e le istanza del padre sono fottute.

Lisp/README.org
Lisp/ool.lisp

index 37430e96ad3a9e45868c116027348118c50d8dc0..f7ced47a4f62f418fc6eea7e7ea8d73b5dd2360c 100644 (file)
       (error "Il primo argomento della lista di methods ~S"
              "deve essere il simbolo 'methods'")))
 
+  (create-methods classname (cdr methods))
   (type-check-fields (cdr fields))
   (inherit (list :classname classname
                     :type 'class
           (field-name-exists name (rest fields)))))
 #+end_src
 
+*** Creazione di metodi
+#+begin_src lisp :tangle ool.lisp
+(defun create-methods (classname methods)
+  (mapcar
+   (lambda (method)
+     (eval (list* 'defun
+                      (first method)
+                      (append '(inst) (second method))
+                      (append '((unless (is-instance inst)
+                                  (error "~A non è un'istanza" inst)))
+                              (cddr method)))))
+   methods))
+#+end_src
+
 ** Creazione di un'istanza
 #+begin_src lisp :tangle ool.lisp
 (defun create-instance (listclass new-fields)
index 71e780fa4d913d3b2ea9a4db6cbce3235b0f74dc..4eba3f86565d586113c2a788129df70ed4d3567a 100644 (file)
@@ -63,6 +63,7 @@
       (error "Il primo argomento della lista di methods ~S"
              "deve essere il simbolo 'methods'")))
 
+  (create-methods classname (cdr methods))
   (type-check-fields (cdr fields))
   (inherit (list :classname classname
                     :type 'class
       (or (equal name (first (first fields)))
           (field-name-exists name (rest fields)))))
 
+(defun create-methods (classname methods)
+  (mapcar
+   (lambda (method)
+     (eval (list* 'defun
+                      (first method)
+                      (append '(inst) (second method))
+                      (append '((unless (is-instance inst)
+                                  (error "~A non è un'istanza" inst)))
+                              (cddr method)))))
+   methods))
+
 (defun create-instance (listclass new-fields)
   ;; Se c'è almeno un field da cambiare
   ;; il cui nome non è una proprietà della classe