#+title: 💀 OOΠin Prolog 💀
-#+author: Bizzoni Leonardo (899629), Barone Matteo(894594), Kier Mirko Tolentino(899728)
+#+author: Bizzoni Leonardo (899629),
+#+author: Barone Matteo(894594),
+#+author: Kier Mirko Tolentino(899728)
+#+options: TOC:nil
* Breve descrizione
42
*** Esempio pratico
#+name: def_class
#+begin_src prolog
-def_class(foo, [], [field(foo, 42), method(foo, [Number], (field(this, foo, Foo),
- Sum is Number + Foo,
- write("Sum: "), writeln(Sum)))]).
-
-def_class(bar, [], [field(bar, "42"), method(bar, [], (write("Favorite number is "),
- field(this, bar, Bar),
- writeln(Bar)))]).
-
-def_class(foobar, [foo, bar], [field(foobar, "Baz"), method(foobar, [X, X, [X]], (!)), method(foobar, [Start, End, [Start | Ls]], (Start =< End,
- N is Start + 1,
- foobar(this, N, End, Ls)))]).
-
+def_class(foo, [], [field(foo, 42),
+ method(foo, [Number], (field(this, foo, Foo),
+ Sum is Number + Foo,
+ write("Sum: "), writeln(Sum)))]).
+
+def_class(bar, [], [field(bar, "42"),
+ method(bar, [], (write("Favorite number is "),
+ field(this, bar, Bar),
+ writeln(Bar)))]).
+
+def_class(foobar, [foo, bar], [field(foobar, "Baz"),
+ method(foobar, [X, X, [X]], (!)),
+ method(foobar, [Start, End, [Start | Ls]],
+ (Start =< End,
+ N is Start + 1,
+ foobar(this, N, End, Ls)))]).
#+end_src
** make
*** Definizione
!.
fieldx(Instance, [FieldName | Others], Res) :-
is_instance(Instance),
- field(Instance, FieldName, Value),
+ field(Instance, FieldName, _Value),
fieldx(Instance, Others, Res).
#+end_src
** define_this
#+begin_src prolog :tangle oop.pl
-define_this(Instance) :-
+define_this(Instance, For) :-
\+ is_list(Instance),
!,
findall(Key = Value, field(Instance, Key, Value), List),
- define_this(List).
+ define_this(List, For).
-define_this([]) :- !.
-define_this([=(Key, Value) | Other]) :-
+define_this([], []) :- !.
+define_this([=(Key, Value) | Other], [Key | Rest]) :-
asserta(field(this, Key, Value)),
- define_this(Other).
+ define_this(Other, Rest).
+#+end_src
+
+** undefine_this
+#+begin_src prolog :tangle oop.pl
+undefine_this([]) :- !.
+undefine_this([FieldName | Other]) :-
+ retract(field(this, FieldName, _Value)),
+ !,
+ undefine_this(Other).
#+end_src
** call_method
call_method(Instance, ClassName, Body) :-
is_instance(Instance, ClassName),
asserta(is_instance(this, ClassName)),
- define_this(Instance),
+ define_this(Instance, For),
call_cleanup(call(Body), (
retractall(is_instance(this, ClassName)),
- retractall(field(this, _, _)))).
+ undefine_this(For))).
#+end_src
** check_value_type
!.
fieldx(Instance, [FieldName | Others], Res) :-
is_instance(Instance),
- field(Instance, FieldName, Value),
+ field(Instance, FieldName, _Value),
fieldx(Instance, Others, Res).
:- dynamic is_class/1.
field(InstanceName, Field, Value),
check_fields(InstanceName, Other).
-define_this(Instance) :-
+define_this(Instance, For) :-
\+ is_list(Instance),
!,
findall(Key = Value, field(Instance, Key, Value), List),
- define_this(List).
+ define_this(List, For).
-define_this([]) :- !.
-define_this([=(Key, Value) | Other]) :-
+define_this([], []) :- !.
+define_this([=(Key, Value) | Other], [Key | Rest]) :-
asserta(field(this, Key, Value)),
- define_this(Other).
+ define_this(Other, Rest).
+
+undefine_this([]) :- !.
+undefine_this([FieldName | Other]) :-
+ retract(field(this, FieldName, _Value)),
+ !,
+ undefine_this(Other).
call_method(Instance, ClassName, Body) :-
is_instance(Instance, ClassName),
asserta(is_instance(this, ClassName)),
- define_this(Instance),
+ define_this(Instance, For),
call_cleanup(call(Body), (
retractall(is_instance(this, ClassName)),
- retractall(field(this, _, _)))).
+ undefine_this(For))).
check_value_type(nil, _X) :- !.
check_value_type(var, X) :- var(X), !.