]> git.leonardobizzoni.com Git - ObjectOriented-Prolog-Lisp/commitdiff
Type checks
authorLeonardoBizzoni <leo2002714@gmail.com>
Thu, 21 Dec 2023 19:52:00 +0000 (20:52 +0100)
committerLeonardoBizzoni <leo2002714@gmail.com>
Thu, 21 Dec 2023 19:52:16 +0000 (20:52 +0100)
Non ho fatto molti test quindi potrebbero esserci errori.

Prolog/README.org
Prolog/oop.pl

index 3f9ce21ea2e26b52017c2ad0bef573cd8f319b45..499e417cba0e3e682dcc339edea5d7590fba0e87 100644 (file)
@@ -190,6 +190,7 @@ add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :-
     %% Se è già definito questo member cancellalo
     retractall(is_member(field(Name, _, _), ClassName)),
 
+    check_value_type(Type, Value),
     asserta(is_member(field(Name, Value, Type), ClassName)),
     add_part(ClassName, OtherParts).
 
@@ -201,6 +202,7 @@ add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :-
     %% Se è già definito questo member cancellalo
     retractall(is_member(field(Name, _, _), ClassName)),
 
+    check_value_type(Type, Value),
     asserta(is_member(field(Name, Value, Type), ClassName)),
     add_part(ClassName, OtherParts).
 
@@ -236,6 +238,8 @@ set_fields_for(InstanceName,
               ClassName,
               [=(Name, Value) | OtherFields]) :-
     field(InstanceName, Name, OldValue),
+    is_member(field(Name, _Value, Type), ClassName),
+    check_value_type(Type, Value),
     retractall(field(InstanceName, Name, OldValue)),
     !,
     asserta(field(InstanceName, Name, Value)),
@@ -279,3 +283,34 @@ call_method(Instance, ClassName, Body) :-
     call(Body),
     retractall(field(this, _, _)).
 #+end_src
+
+** check_value_type
+#+begin_src prolog :tangle oop.pl
+check_value_type(nil, _X) :- !.
+check_value_type(var, X) :- var(X), !.
+check_value_type(nonvar, X) :- nonvar(X), !.
+check_value_type(integer, X) :- integer(X), !.
+check_value_type(float, X) :- float(X), !.
+check_value_type(rational, X) :- rational(X), !.
+check_value_type(number, X) :- number(X), !.
+check_value_type(atom, X) :- atom(X), !.
+check_value_type(string, X) :- string(X), !.
+check_value_type(atomic, X) :- atomic(X), !.
+check_value_type(compound, X) :- compound(X), !.
+check_value_type(callable, X) :- callable(X), !.
+check_value_type(ground, X) :- ground(X), !.
+
+check_value_type(ClassName, Instance) :-
+    is_class(ClassName),
+    is_instance(Instance, ClassName),
+    !.
+
+check_value_type(ClassName, Instance) :-
+    is_child_of(ClassName, ChildClass),
+    is_instance(Instance, ChildClass),
+    !.
+
+check_value_type(ClassName, Instance) :-
+    is_child_of(ClassName, ChildClass),
+    check_value_type(ChildClass, Instance).
+#+end_src
index 7bcd4c674e3923f204ef5c912db5c83f7394e35c..97f659f648686757175c1213d01647bc49870ffa 100644 (file)
@@ -133,6 +133,7 @@ add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :-
     %% Se è già definito questo member cancellalo
     retractall(is_member(field(Name, _, _), ClassName)),
 
+    check_value_type(Type, Value),
     asserta(is_member(field(Name, Value, Type), ClassName)),
     add_part(ClassName, OtherParts).
 
@@ -144,6 +145,7 @@ add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :-
     %% Se è già definito questo member cancellalo
     retractall(is_member(field(Name, _, _), ClassName)),
 
+    check_value_type(Type, Value),
     asserta(is_member(field(Name, Value, Type), ClassName)),
     add_part(ClassName, OtherParts).
 
@@ -173,6 +175,8 @@ set_fields_for(InstanceName,
               ClassName,
               [=(Name, Value) | OtherFields]) :-
     field(InstanceName, Name, OldValue),
+    is_member(field(Name, _Value, Type), ClassName),
+    check_value_type(Type, Value),
     retractall(field(InstanceName, Name, OldValue)),
     !,
     asserta(field(InstanceName, Name, Value)),
@@ -206,3 +210,31 @@ call_method(Instance, ClassName, Body) :-
     define_this(Instance),
     call(Body),
     retractall(field(this, _, _)).
+
+check_value_type(nil, _X) :- !.
+check_value_type(var, X) :- var(X), !.
+check_value_type(nonvar, X) :- nonvar(X), !.
+check_value_type(integer, X) :- integer(X), !.
+check_value_type(float, X) :- float(X), !.
+check_value_type(rational, X) :- rational(X), !.
+check_value_type(number, X) :- number(X), !.
+check_value_type(atom, X) :- atom(X), !.
+check_value_type(string, X) :- string(X), !.
+check_value_type(atomic, X) :- atomic(X), !.
+check_value_type(compound, X) :- compound(X), !.
+check_value_type(callable, X) :- callable(X), !.
+check_value_type(ground, X) :- ground(X), !.
+
+check_value_type(ClassName, Instance) :-
+    is_class(ClassName),
+    is_instance(Instance, ClassName),
+    !.
+
+check_value_type(ClassName, Instance) :-
+    is_child_of(ClassName, ChildClass),
+    is_instance(Instance, ChildClass),
+    !.
+
+check_value_type(ClassName, Instance) :-
+    is_child_of(ClassName, ChildClass),
+    check_value_type(ChildClass, Instance).