Hey GiNaC people!

First of all, thank you for this great library!

I'm working on a web-based interface for GiNaC as a hobby project and I wanted to share it with you.

You can try a demo frontend here: https://daninet.github.io/ginac-wasm/
Source code: https://github.com/Daninet/ginac-wasm

There is no operator overloading in JavaScript, so I had to implement functions like add(), mul() for the different operations. The GiNaC commands are batched for faster processing because WASM <=> JavaScript calls are too expensive.  The demo frontend includes a PEG-based parser written in JavaScript, but the embedded parser is also exposed through the parse() function.

At this moment, the JavaScript/TypeScript API looks like this:
const GiNaC = await initGiNaC('./dist/ginac.wasm');
const g = getFactory();
GiNaC(g.mul(g.numeric('2'), g.pow(g.symbol('x'), g.numeric('2'))));
GiNaC(g.series(g.atan(g.symbol('x')), g.symbol('x'), g.numeric('5')));

On my computer, the native ginsh is about 10x faster in estimating Pi with Machin’s formula compared to my WebAssembly port. That's because of the expensive C++ exception mocks generated by Emscripten, which compensate for the lack of native browser support for exceptions in WebAssembly. I estimate that the performance gap can be brought down to about 1/2 of native performance once the native exception instructions are getting wildly available in browsers.

I plan to publish it on NPM (the JavaScript package library) when I manage to stabilize the API and implement the remaining features.

What do you think? Do you have any suggestions or ideas?

Best regards,
Dani Biró