%% 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).
%% 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).
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)),
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
%% 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).
%% 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).
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)),
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).