Node:prolog_event, Next:An example, Previous:Evaluate a Tcl expression and get Prolog events, Up:Event functions
The Tcl interpreters under the SICStus Prolog library are extended with
a command, prolog_event, for adding events to a Prolog event queue.
The prolog_event command has the following form:
prolog_event Terms ...
where Terms are strings that contain the printed representation of Prolog
terms. These are stored in a queue and retrieved as Prolog terms by
tcl_event/3 or tk_next_event/[2,3] (described above).
An example of using the prolog_event command:
test_event(Event) :-
tcl_new(Interp),
tcl_event(Interp, [prolog_event, dq(write(zap(42)))], Event),
tcl_delete(Interp).
with the query:
| ?- test_event(Event).
will succeed, binding Event to the list [zap(42)].
This is because tcl_event converts its argument using the special
Command Format conversion (see Command Format) which yields the Tcl
command prolog_event "zap(42)". This command is evaluated in the
Tcl interpreter referenced by the variable Interp. The effect of
the command is to take the string given as argument to
prolog_event (in this case "zap(42)") and to place it on
the Tcl to Prolog event queue. The final action of a tcl_event/3
call is to pick up any strings on the Prolog queue from Tcl,
add a trailing full stop and space to each string, and parse them as
Prolog terms, binding Event to the list of values, which in this case
is the singleton list [zap(42)]. (The queue is a list the
elements of which are terms put there through calls to
prolog_event).
If any of the Term-s in the list of arguments to
prolog_event is not a valid representation of a Prolog term, then
an exception is raised in Prolog when it is converted from the Tcl
string to the Prolog term using read. To ensure that Prolog will
be able to read the term correctly it is better to always use
write_canonical and to ensure that Tcl is not confused by special
characters in the printed representation of the prolog term it is best
to wrap the list with list.
A safer variant that safely passes any term from Prolog via Tcl and back
to Prolog is thus:
test_event(Term, Event) :-
tcl_new(Interp),
tcl_event(Interp, list([prolog_event, write_canonical(Term)]), Event),
tcl_delete(Interp).