Sujet : Code Generation with write/[1,2] [Some Testcases] (Was: Streamable DOM and obsolete put_code/[1,2])
De : janburse (at) *nospam* fastmail.fm (Mild Shock)
Groupes : comp.lang.prologDate : 07. Apr 2025, 08:58:46
Autres entêtes
Message-ID : <vt00jk$sg63$1@solani.org>
References : 1
User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0 SeaMonkey/2.53.20
Hi,
One of the dirty tricks, I use in the Dogelog Player
backend for code generation. I do generate JavaScript,
Python and Java code via write/[1,2].
How does it work. Here an example: Wanna write a BigInt
from JavaScript, like for example 123n. No problem put
it into an atom and use unquoted write:
/* JavaScript Generator */
?- write('123n').
123n
Now there are some nasty things. Like for example
this test case. Very interesting behaviour:
/* Dogelog Player 1.3.2 */
?- write(- '123n').
- 123n
/* SWI-Prolog 9.3.22 */
?- write(- '123n').
- 123n
On the other hand:
/* Trealla Prolog 2.67.27 */
?- write(- '123n'), nl.
-123n
/* Scryer Prolog 0.9.4 */
?- write(- '123n'), nl.
-123n
See the difference? A space inserted or not. Its quite
some twilight zone, the behaviour of unquoted atoms.
Bye
Mild Shock schrieb:
Hi,
The development of Novacore takes interesting turns.
Originally more accidentially, because I observed it
can serve a few interesting use cases, like atomic
logging with some unspoken or spoken gurantees,
I introduced put_atom/[1,2] in Novacore streams:
> put_atom(S, A):
> The built-in succeeds. As a side effect, it adds
> the atom to the stream S.
Now because I am revising my streamable DOMs, the
"HTML writer" part, I even went so far as to
bootstrap put_code/[1,2] from it:
> put_code(Stream, Code) :-
> char_code(Atom, Code),
> put_atom(Stream, Atom).
One can eliminate each put_code/[1,2] call such
as put_code(S, 0'\n) by a put_atom/[1,2] call
such as put_atom(S, '\n'). The performance is the
same, in my case can be slighly better since under
the hood put_code and put_atom called the same
stream meachnism.
But the main reason I eliminate put_code was
to have a single point. Because the Prolog
write_term/1 is 100% written in Prolog, in the
end it only only uses put_atom.
Bye