foreign-c/README.md

103 lines
6.3 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.
[Issue trackers](https://sr.ht/~retropikzel/r7rs-pffi/trackers)
[Maling lists](https://sr.ht/~retropikzel/r7rs-pffi/lists)
[Jenkins](https://jenkins.scheme.org/job/r7rs/job/r7rs-srfi/job/main/).
For documentation run mkdocs serve or see docs/.
## 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
## 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.
## Implementation table
| | Chibi | Chicken 5 | Cyclone | Gambit | Gauche | Gerbil | Guile | Kawa | Larceny | Mosh | Racket | Sagittarius | Skint | STklos | tr7 | Ypsilon |
| ------------------------------- | ----- | --------- | ------- | ------- | ------ | ------ | ----- | ---- | ------- | ---- | ------ | ----------- | ----- | ------ | --- | ------- |
| pffi-init | X | X | X | X | X | X | X | X | X | X | X | X | X | X | | |
| pffi-size-of | X | X | X | X | | | X | X | | X | X | X | | X | | |
| pffi-shared-object-auto-load | X | X | X | | | | X | X | | X | X | X | | X | | |
| pffi-shared-object-load | X | X | X | | | | X | X | | X | X | X | | X | | |
| pffi-pointer-null | X | X | X | | | | X | X | | X | X | X | | X | | |
| pffi-pointer-null? | X | X | X | | | | X | X | | X | X | X | | X | | |
| pffi-pointer-allocate | X | X | X | | | | X | X | | X | X | X | | X | | |
| pffi-pointer? | X | X | X | | | | X | X | | X | X | X | | X | | |
| pffi-pointer-free | X | X | X | | | | X | X | | X | X | X | | X | | |
| pffi-pointer-set! | X | X | X | | | | X | X | | X | X | X | | | | |
| pffi-pointer-get | X | X | X | | | | X | X | | X | X | X | | | | |
| pffi-string->pointer | X | X | X | | | | X | X | | X | X | X | | | | |
| pffi-pointer->string | X | X | X | | | | X | X | | X | X | X | | | | |
| pffi-define | X | X | X | | | | X | X | | X | X | X | | | | |
| pffi-define-callback | | X | | | | | X | | | X | X | X | | | | |
| pffi-pointer-address | | X | | | | | X | | | | X | X | | | | |
| pffi-pointer-dereference | | | | | | | X | X | | | X | X | | | | |
### Usage notes
- Chibi
- Install libffi-dev
- Build with:
- chibi-ffi retropikzel/r7rs-pffi/r7rs-pffi-chibi.stub
- ${CC} -o retropikzel/r7rs-pffi/r7rs-pffi-chibi.so -fPIC -shared retropikzel/r7rs-pffi/r7rs-pffi-chibi.c -lchibi-scheme -lffi
- Chicken 5
- Needs [r7rs egg](https://wiki.call-cc.org/eggref/5/r7rs)
- Kawa
- 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
- Larceny
- Runs on 32 bit mode
- Mosh
- FFI only works on x86_64
- Racket
- Needs [racket-r7rs](https://github.com/lexi-lambda/racket-r7rs)
### Design/exploration/waiting for implementation features
- [LIPS](https://lips.js.org/)
- Will work on nodejs by using some C FFI library from npm
- Javascript side needs design
- [Biwascheme](https://www.biwascheme.org/)
- Will work on nodejs by using some C FFI library from npm
- Javascript side needs design
- [MIT-Scheme](https://www.gnu.org/software/mit-scheme/)
- [s7](https://scheme.fail://ccrma.stanford.edu/software/snd/snd/s7.html)
- [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
- When LIPS and Biwascheme Javascript side is done then Gambit should be done too
- [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