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
74
75
76
|
:- module(loader, []).
load_module_from_file(File) :-
write('Loading file: '),
write(File),
nl,
( atom_concat(_, '.pl', File)
-> open(File, read, Stream)
; atom_concat(File, '.pl', File1),
open(File1, read, Stream)
),
read_and_handle_terms(Stream, user, _),
close(Stream),
write('Loaded file: '),
write(File),
nl.
read_and_handle_terms(Stream, Module0, Module) :-
( read_one_term(Stream, Term)
-> handle_term(Term, Module0, Module1),
read_and_handle_terms(Stream, Module1, Module)
; Module = Module0
).
read_one_term(Stream, Term) :-
consume_whitespace(Stream),
peek_char(Stream, NextCh),
NextCh \= end_of_file,
read_term(Stream, Term, []).
whitespace(' ').
whitespace(' ').
whitespace('
').
consume_whitespace(S) :-
peek_char(S, Ch),
( whitespace(Ch)
-> get_char(S, _), consume_whitespace(S)
; true
).
handle_term(:- Directive, Module, NewModule) :-
!,
handle_directive(Directive, Module, NewModule).
handle_term(Head :- Body, Module, Module) :-
!,
Module:assertz(Head :- Body).
handle_term(Head --> Body, Module, Module) :-
!,
write('DCG RULE: '),
write(Head --> Body),
nl.
handle_term(Head, Module, Module) :-
Module:assertz(Head).
handle_directive(op(Priority, Specifier, Operator), Module, Module) :-
Module:op(Priority, Specifier, Operator).
handle_directive(include(F), Module, NewModule) :-
open(F, read, S),
read_and_handle_terms(S, Module, NewModule),
close(S).
handle_directive(ensure_loaded(F), Module, Module) :-
ensure_load(F).
handle_directive(D, Module, Module) :-
write('Cannot handle directive: '),
write(D),
nl.
ensure_loads(_) :- fail.
ensure_load(F) :-
( ensure_loads(F)
-> true
; asserta(ensure_loads(F)), load_module_from_file(F)
).
|