-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinterpreter.pl
73 lines (66 loc) · 1.77 KB
/
interpreter.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
%implement the jumps and the interpreter is done.
translate(C) :-
is_list(C),
memory_zone(Memory),
translate(C, C, Memory, 0).
translate(_,[],_,_).
translate(C,["FUCK"|T],Memory, X) :-
change_mem_value(add, Memory, X, 1, Memory2),
translate(C,T,Memory2,X), !.
translate(C,["SHIT"|T],Memory, X) :-
change_mem_value(add, Memory, X, -1, Memory2),
translate(C,T,Memory2,X), !.
translate(C,["AAAH"|T], Memory,X) :-
memory_size(Size),
X2 is X + 1,
X3 is X2 mod Size,
translate(C,T,Memory, X3), !.
translate(C,["AAAAGH"|T], Memory,X) :-
memory_size(Size),
X2 is X - 1,
X3 is X2 mod Size,
translate(C,T,Memory, X3), !.
translate(C,["OW"|_],Memory,X) :-
nth0(X, Memory, N),
N = 0,
jump(C,1,C2),
translate(C,C2,Memory,X), !.
translate(C,["OWIE"|_], Memory,X) :-
nth0(X, Memory, N),
N = 0,
jump(C,-1,C2),
translate(C,C2,Memory,X), !.
translate(C, ["!!!!!!"|T], Memory, X) :-
nth0(X,Memory,Code),
char_code(L,Code),
write(L),
translate(C,T,Memory,X), !.
translate(C, ["WHAT?!"|T], Memory, X) :-
get_char(Character),
char_code(Character,Code),
change_mem_value(set, Memory, X, Code, Memory2),
translate(C,T,Memory2,X), !.
%memory management
memory_size(30000).
cell_size(256).
memory_zone(Memory) :-
memory_size(Size),
length(Memory, Size),
maplist(=(0), Memory).
%change memory locations
change_mem_value(add, [H|T], 0, Value, [NewValue|T2]) :-
TempValue is H + Value,
cell_size(CellSize),
Max is CellSize - 1,
NewValue is TempValue mod Max.
change_mem_value(set, [_|Tail],0, Value, [Value|Tail]).
change_mem_value(Type, [H|T], Index, Value, [H|R]) :-
Index > 0,
NewIndex is Index - 1,
change_mem_value(Type, T, NewIndex, Value, R).
%jump in memory
jump(C, 0, C).
jump([_|T], I, R) :-
I > 0,
I2 is I - 1,
jump(T,I2,R).