103 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
# Portable Foreign Function Interface for R8RS 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
 |