On Wed, Nov 22, 2023 at 08:33:38AM -0800, Kenneth Miller wrote:
> Are there any language bindings to ocaml? Or a way to generate them, like
> with swig?
AFAIK there are no "language bindings". There were some efforts
in this direction, but not much success. Basicaly the only
successful thing is Sage interface which allows you to call
FriCAS functions from Python.
Some issuse that anybody trying to do "language binding" must
resolve:
- FriCAS is garbage collected and FriCAS may move its data
in memory whenever it wants. Currently simple solution
to this is to copy relevant data. FriCAS runs on top
of Lisp and you can use FriCAS data directly from Lisp.
When FriCAS is build on top of ECL, then you may also
access FriCAS data from C (garbage collector in ECL is
"non-moving" so access from C is safe). In principle
this allows access to FriCAS data from any language
which can call C. But such acces would go via C functions
provided by ECL for accessing Lisp data, and one stil
would need some way to make sense of the data.
Sage solves this by using textual output from FriCAS (IIUC
mostly FriCAS InputForm). On FriCAS side this is produced by
buitin routine, on Sage side they have a parser (the format is
easy to parse).
- FriCAS is organized into domains and packages. Domains
are abstract data types, they define available operations.
To make sense of FriCAS data you need to map operations
to your language. No existing language has the same
semantics, so one have to define mapping between languages.
To claryfy a bit: FriCAS has overloading and decides
which function to call based on types of arguments and
type of result. And FriCAS can generate new types at
runtime. So you need some way to represent FriCAS types
and use them for overload resolution. In untyped language
you can treat all FriCAS things as generic data and put
all concerns of correctness on the user. In Ocaml there
is question how FriCAS types play with Ocaml types (do you
want to define a "generic" type that can represent any
FriCAS data?).
Sage maps selected FriCAS types to its own types (Python
classes). IIUC it directy exposes very small number
of operations. You can access more FriCAS functionality
by passing text commands.
As you can see there are tradoffs. Really good high level
interface seem pretty hard to do. Low level interface while
easier to do still have some unpleasent tradeoffs. If
you are satisfied with passing textual data and commands,
then you need to invest some effort in parser and possibly
mapping parsed data to Ocaml types, but basicaly this
should be doable with reasonable effort.
--
Waldek Hebisch