* If Term is a variable, it is printed using write/2.
* If Term is a nonvariable or a metaterm, then portray(Stream, Term) is called. If it succeeds, so does print/2. Otherwise, if Term is atomic, it is written using write/2 and the predicate succeeds. If Term is a compound term, its main functor is printed using write/2 and print/2 is called recursively on its arguments.
Note that when this predicate is used to print a list, only the elements of the list, i.e. the heads, are passed to the recursive calls of print/2, but not the list tails. Thus e.g. a list [1,2,3] will be passed once to portray/2 as a whole and then the elements 1, 2, 3, but not [2,3], [3] and [].
If portray/2 is not visible but portray/1 is, it is called instead of portray/2, but then the Stream argument cannot be passed to it, and it is therefore the responsibility of portray/1 itself to print the data to the correct stream. portray/1, 2 is used by the system when printing out the answer binding in the top-level loop to the answer_output stream) and in the debugger, when the output command is set to print, to the debug_output stream.
As usual, the output is buffered, so it may need to be flushed (e.g. explicitly using flush/1).
Note The output of print/2 is not necessarily in a form acceptable to read/1,2 and there is no 'printq' predicate.
Success:
[eclipse]: [user].
portray(S, a) :- write(S, b).
p(a).
user compiled 148 bytes in 0.00 seconds
yes.
[eclipse]: write(write(a)), nl, print(output, print(a)).
write(a)
print(b)
yes.
[eclipse]: trace.
yes.
Debugger switched on - creep mode
[eclipse]: p(a).
(1) 0 CALL p(a) (dbg)?- output: write ('o' typed)
(1) 0 CALL p(a) (dbg)?- output: display
(1) 0 CALL p(a) (dbg)?- output: print/writeq
(1) 0 CALL p(b) (dbg)?- creep
(1) 0 EXIT p(b) (dbg)?- creep
yes.
Error:
print(S, a(b,c)). (Error 4).
print("str", a(b,c)). (Error 5).
print(input, X). (Error 192).
print(nostr, X + 2). (Error 193).