141 lines
3.6 KiB
Markdown
141 lines
3.6 KiB
Markdown
# Portable Foreign Function Interface for R7RS schemes
|
|
|
|
An attempt to make basic foreign function interface that is supported on
|
|
multiple R7RS Sceheme implementations.
|
|
|
|
Pull requests to fix bugs and add more tests are welcome.
|
|
|
|
## Goals
|
|
|
|
- Support only R7RS implementations
|
|
- Needs to have cond-expand and library support atleast (propably much more)
|
|
- 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 support all R7RS implementations
|
|
- To have every possible FFI feature
|
|
- Compiling of C code at any point
|
|
- That is no stubs, no C code generated by the library and so on
|
|
|
|
|
|
For bugs you can use the
|
|
[Bugs](https://codeberg.org/r7rs-pffi/pffi/projects/9101)
|
|
|
|
## All tests (there is not that many yet) pass
|
|
|
|
- [Sagittarius](https://bitbucket.org/ktakashi/sagittarius-scheme/wiki/Home)
|
|
- [Guile](https://www.gnu.org/software/guile/)
|
|
- [Kawa](https://www.gnu.org/software/kawa/index.html)
|
|
- Needs atleast java 21
|
|
- Needs jvm flags
|
|
- java --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 --enable-preview -jar kawa.jar FILENAME.scm
|
|
- [Racket](https://racket-lang.org/)
|
|
- [Chicken](https://www.call-cc.org/)
|
|
|
|
## Not all tests pass
|
|
|
|
- [STKlos](https://stklos.net/)
|
|
- [Cyclone](https://justinethier.github.io/cyclone/)
|
|
- [Gambit](https://gambitscheme.org)
|
|
|
|
## Support waiting for the implementation
|
|
|
|
- [LIPS](https://lips.js.org/)
|
|
- Waiting for implementation to have cond-expand and library support
|
|
- Will only work on nodejs
|
|
|
|
## Not supported
|
|
|
|
- [Chibi](https://synthcode.com/scheme/chibi)
|
|
- FFI requires C code
|
|
- [MIT-Scheme](https://www.gnu.org/software/mit-scheme/)
|
|
- FF requires C code
|
|
- [tr7](https://gitlab.com/jobol/tr7)
|
|
- FFI requires C code
|
|
- [Gauche](https://practical-scheme.net/gauche/)
|
|
- FFI requires C code
|
|
|
|
|
|
## Hacking
|
|
|
|
main.sld is the real main which is copied to main.scm
|
|
|
|
## Documentation
|
|
|
|
On some implementations these are procedures, on some macros.
|
|
|
|
### Types
|
|
|
|
Types are given as symbols, for example 'int8 or 'pointer.
|
|
|
|
- int8
|
|
- uint8
|
|
- int16
|
|
- uint16
|
|
- int32
|
|
- uint32
|
|
- int64
|
|
- uint64
|
|
- char
|
|
- unsigned-char
|
|
- short
|
|
- unsigned-short
|
|
- int
|
|
- unsigned-int
|
|
- long
|
|
- unsigned-long
|
|
- float
|
|
- double
|
|
- string
|
|
- pointer
|
|
|
|
|
|
### Procedures or macros
|
|
|
|
#### pffi-shared-object-auto-load
|
|
|
|
Arguments:
|
|
|
|
- object-name (symbol)
|
|
- The name of the dynamic library file you want to load without the "lib" in fron of it or .so/.dll at the end
|
|
- addition-paths (list (string)...)
|
|
- Any additional paths you want to search for the library
|
|
|
|
Returns:
|
|
|
|
- (object) Shared object, the type depends on the implementation
|
|
|
|
#### pffi-shared-object-load
|
|
|
|
It is recommended to use the pffi-shared-object-auto-load instead of this
|
|
directly.
|
|
|
|
Arguments:
|
|
|
|
- headers (list (string) ...) Headers that need to be included
|
|
- Example (list "curl/curl.h")
|
|
- path (string) The full path to the shared object you want to load, including any "lib" infront and .so/.dll at the end
|
|
- Example "libcurl.so"
|
|
|
|
Returns:
|
|
|
|
- (object) Shared object, the type depends on the implementation
|
|
|
|
|
|
|
|
#### pffi-define
|
|
|
|
Defines new foreign procedure.
|
|
|
|
Arguments:
|
|
|
|
- scheme-name () The name of the procedure used on scheme side
|
|
- shared-object (object) The shared object
|
|
- Use pffi-shared-object-auto-load and pffi-shared-object-load to get this
|
|
- c-name (symbol) The name of the C function
|
|
- return-type (symbol) The return type of the C function
|
|
- arguments-types (list (symbol) ...) The C function argument types
|