add_part(ClassName, []) :- is_class(ClassName), !.
add_part(ClassName, [field(Name, Value) | OtherParts]) :-
- is_class(ClassName),
- is_member(field(Name, _, _), ClassName),
- !,
+ is_class(ClassName),
+ is_member(field(Name, _, _), ClassName),
+ !,
- %% Se è già definito questo member cancellalo
- retractall(is_member(field(Name, _, _), ClassName)),
+ %% Se è già definito questo member cancellalo
+ retractall(is_member(field(Name, _, _), ClassName)),
- asserta(is_member((field(Name, Value, nil)), ClassName)),
- add_part(ClassName, OtherParts).
+ asserta(is_member((field(Name, Value, nil)), ClassName)),
+ add_part(ClassName, OtherParts).
add_part(ClassName, [field(Name, Value) | OtherParts]) :-
- is_class(ClassName),
- \+ is_member(field(Name, _, _), ClassName),
- !,
+ is_class(ClassName),
+ \+ is_member(field(Name, _, _), ClassName),
+ !,
- asserta(is_member((field(Name, Value, nil)), ClassName)),
- add_part(ClassName, OtherParts).
+ asserta(is_member((field(Name, Value, nil)), ClassName)),
+ add_part(ClassName, OtherParts).
add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :-
- is_class(ClassName),
- is_member(field(Name, _, _), ClassName),
- !,
+ is_class(ClassName),
+ is_member(field(Name, _, _), ClassName),
+ !,
- %% Se è già definito questo member cancellalo
- retractall(is_member(field(Name, _, _), ClassName)),
+ %% 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).
+ check_value_type(Type, Value),
+ asserta(is_member(field(Name, Value, Type), ClassName)),
+ add_part(ClassName, OtherParts).
add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :-
- is_class(ClassName),
- \+ is_member(field(Name, _, _), ClassName),
- !,
+ is_class(ClassName),
+ \+ is_member(field(Name, _, _), ClassName),
+ !,
- %% Se è già definito questo member cancellalo
- retractall(is_member(field(Name, _, _), ClassName)),
+ %% 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).
+ check_value_type(Type, Value),
+ asserta(is_member(field(Name, Value, Type), ClassName)),
+ add_part(ClassName, OtherParts).
add_part(ClassName, [method(Name, ArgList, Body) | OtherParts]) :-
- is_list(ArgList),
- is_class(ClassName),
+ is_list(ArgList),
+ is_class(ClassName),
- asserta(is_member(method(Name, ArgList, Body), ClassName)),
+ asserta(is_member(method(Name, ArgList, Body), ClassName)),
- Head =.. [Name, InstanceName | ArgList],
- !,
- edit_body(InstanceName, Body, NewBody),
- asserta(Head :- (call_method(InstanceName, ClassName, NewBody))),
+ Head =.. [Name, InstanceName | ArgList],
+ !,
+ replace(this,InstanceName,Body,NewBody),
+ asserta(Head :- (call_method(InstanceName, ClassName, NewBody))),
- add_part(ClassName, OtherParts).
+ add_part(ClassName, OtherParts).
#+end_src
** set_default_fields_for
retractall(is_instance(this, ClassName)))).
#+end_src
-** edit_body
-#+begin_src prolog
-edit_body(InstanceName, OldBody, NewBody) :-
- conjunction_to_list(OldBody, BodyList),
- replace(field(this, Name, Value), field(InstanceName, Name, Value), BodyList, Result),
- list_to_conjunction(Result, NewBody).
- #+end_src
-
-** conjunction_to_list
-#+begin_src prolog
-conjunction_to_list(Body, [P | Ps]) :-
- Body = (P, Conjuncts),
- !,
- conjunction_to_list(Conjuncts, Ps).
-conjunction_to_list(Predicate, [Predicate]) :- !.
-#+end_src
-
-** list_to_conjunction
-#+begin_src prolog
-list_to_conjunction([], true).
-list_to_conjunction([P|Ps], (P, Conjuncts)) :- list_to_conjunction(Ps, Conjuncts).
-#+end_src
-
** replace
#+begin_src prolog
-replace(_, _, [], []) :- !.
-replace(Old, New, [Old | L1], [New | L2]) :- !, replace(Old, New, L1, L2).
-replace(Old, New, [E | L1], [E | L2]) :- E \= Old, !, replace(Old, New, L1, L2).
+replace(Subterm0, Subterm, Term0, Term) :-
+ ( Term0 == Subterm0 -> Term = Subterm
+ ; var(Term0) -> Term = Term0
+ ; Term0 =.. [F|Args0],
+ maplist(replace(Subterm0,Subterm), Args0, Args),
+ Term =.. [F|Args]
+ ).
+
#+end_src
** check_value_type
Head =.. [Name, InstanceName | ArgList],
!,
- edit_body(InstanceName, Body, NewBody),
- asserta(Head :- (call_method(InstanceName, ClassName, NewBody))),
+ replace(this,InstanceName,Body,NewBody),
+ asserta(Head :- (call_method(InstanceName,ClassName,NewBody))),
add_part(ClassName, OtherParts).
call_cleanup(call(Body), (
retractall(is_instance(this, ClassName)))).
-edit_body(InstanceName, OldBody, NewBody) :-
- conjunction_to_list(OldBody, BodyList),
- replace(field(this, Name, Value), field(InstanceName, Name, Value), BodyList, Result),
- list_to_conjunction(Result, NewBody).
-
-conjunction_to_list(Body, [P | Ps]) :-
- Body = (P, Conjuncts),
- !,
- conjunction_to_list(Conjuncts, Ps).
-conjunction_to_list(Predicate, [Predicate]) :- !.
-
-list_to_conjunction([], true).
-list_to_conjunction([P|Ps], (P, Conjuncts)) :- list_to_conjunction(Ps, Conjuncts).
-
-replace(_, _, [], []) :- !.
-replace(Old, New, [Old | L1], [New | L2]) :- !, replace(Old, New, L1, L2).
-replace(Old, New, [E | L1], [E | L2]) :- E \= Old, !, replace(Old, New, L1, L2).
-
+replace(Subterm0, Subterm, Term0, Term) :-
+ ( Term0 == Subterm0 -> Term = Subterm
+ ; var(Term0) -> Term = Term0
+ ; Term0 =.. [F|Args0],
+ maplist(replace(Subterm0,Subterm), Args0, Args),
+ Term =.. [F|Args]
+ ).
check_value_type(nil, _X) :- !.
check_value_type(var, X) :- var(X), !.