foreign-c/README.md

102 lines
3.9 KiB
Markdown

# Portable Foreign Function Interface for R7RS schemes
Foreign function interface that is supported on multiple R7RS Sceheme implementations.
Note that this software is in **alpha** stage. That said the interface should not be changing anymore.
Any help in form of constructive advice and bug reports are appreciated.
[Documentation](https://retropikzel.neocities.org/r7rs-pffi/) or run mkdocs serve or see docs/.
[Issue trackers](https://sr.ht/~retropikzel/r7rs-pffi/trackers)
[Maling lists](https://sr.ht/~retropikzel/r7rs-pffi/lists)
For documentation see [retropikzel.neocities.org/r7rs-pffi](retropikzel.neocities.org/r7rs-pffi)
or run mkdocs serve or see or docs/ directory.
For status of what tests pass on which implementations see
[Jenkins](https://jenkins.staging.scheme.org/job/r7rs-pffi/job/master/).
## Goals
- Support only R7RS implementations
- Same interface on all implementations
- Some things that are procedures on one implementation are macros on other,
but they must behave the same
## Non goals
- To have every possible FFI feature
- Compiling of used library C code at any point
- That is no stubs, no C code generated by the library and so on
- The pffi library itself may require compilation on installation
## Known issues that are worked on
- Passing struct does not work on Chicken
- For example [SDL2-ttf TTF_RenderUTF8_Solid](https://wiki.libsdl.org/SDL2_ttf/TTF_RenderUTF8_Solid)
wants the color to be passed as struct.
- Not a problem on Guile, Sagittarius or Racket
- Cyclone status unknown, assumed same as Chicken
## Status
Currently the interface of the library is in okay shape. It propably will not change much but no
guarantees are being made just yet.
### Usable
- [Guile](https://www.gnu.org/software/guile/)
- [Sagittarius](https://bitbucket.org/ktakashi/sagittarius-scheme/wiki/Home)
- [Chicken 5](https://www.call-cc.org/)
- Needs [r7rs egg](https://wiki.call-cc.org/eggref/5/r7rs)
- [Racket](https://racket-lang.org/)
- Needs [racket-r7rs](https://github.com/lexi-lambda/racket-r7rs)
### Work in progress
- [Cyclone](https://justinethier.github.io/cyclone/)
- No callbacks implemented yet
- [Kawa](https://www.gnu.org/software/kawa/index.html)
- No callbacks implemented yet
- Needs at least java version 22
- Needs jvm flags:
- --add-exports java.base/jdk.internal.foreign.abi=ALL-UNNAMED
- --add-exports java.base/jdk.internal.foreign.layout=ALL-UNNAMED
- --add-exports java.base/jdk.internal.foreign=ALL-UNNAMED
- --enable-native-access=ALL-UNNAMED
- [Gambit](https://gambitscheme.org)
- [Mosh](https://mosh.monaos.org)
- [STKlos](https://stklos.net/)
### Design/exploration
- [LIPS](https://lips.js.org/)
- Will work on nodejs by using some Javascript FFI
- Javascript side needs design
- [Biwascheme](https://www.biwascheme.org/)
- Will work on nodejs by using some Javascript FFI
- Javascript side needs design
- [Chibi](https://synthcode.com/scheme/chibi)
- [MIT-Scheme](https://www.gnu.org/software/mit-scheme/)
- [tr7](https://gitlab.com/jobol/tr7)
- [Gauche](https://practical-scheme.net/gauche/)
- [s7](https://scheme.fail://ccrma.stanford.edu/software/snd/snd/s7.html)
- [Gerbil](https://cons.io/)
- Should be possible as built on gambit, but makes sense to make gambit support first
- [Ypsilon](http://www.littlewingpinball.com/doc/en/ypsilon/)
- [Larceny](https://larcenists.org/)
- [Skint](https://github.com/false-schemers/skint)
- [Airship](https://gitlab.com/mbabich/airship-scheme)
- [Other gambit targets](https://gambitscheme.org/)
- Gambit compiles to different targets other than C too, for example Javascript. It would be cool
and interesting to see if this FFI could also support some of those
- [s48-r7rs](https://codeberg.org/prescheme/s48-r7rs)
- [prescheme](https://codeberg.org/prescheme/prescheme)
### Will/can not be supported
- [Loko](https://scheme.fail/)
- Desires no C interop, I can respect that