Fill in section about the data model

This commit is contained in:
Joshua Suskalo 2021-09-25 13:41:03 -05:00
parent e060046e81
commit 2fca24aeab

View file

@ -488,7 +488,50 @@ Clojure functions serialized to this type will have their arguments and return
value exactly match the types specified and will not perform any serialization value exactly match the types specified and will not perform any serialization
or deserialization at their boundaries. or deserialization at their boundaries.
### TODO Data Model ### Data Model
In addition to the macros and functions provided to build a Clojure API for
native libraries, facilities are provided for taking data and loading all the
symbols specified by it. This can be useful if a library provides (or an
external provider maintains) a data representation of their API, as Clojure data
to represent it may be programmatically generated from these sources.
The data to represent an API is a map with the following form:
```clojure
(def strlen-libspec
{:strlen {:type :function
:symbol "strlen"
:function/args [::ffi/c-string]
:function/ret ::ffi/long}})
```
Each key in this map represents a single symbol to be loaded. The value is a map
with at least the keys `:type` and `:symbol`. These are the currently recognized
types:
- function
- varargs-factory
- const
- static-var
Each one has its own set of additional keys which can be added to the map. Both
`function` and `varargs-factory` have the three keys `:function/args`,
`:function/ret`, and `:function/raw-fn?`. The `const` type has `:const/type` and
`static-var` has `:static-var/type`.
This data can be passed to the function `reify-libspec`, which will take the
data and return a map from the same keys as the input map to whatever value is
appropriate for a given symbol type (e.g. a Clojure function for `function`, a
value for `const`, etc.).
```clojure
(ffi/reify-libspec strlen-libspec)
;; => {:strlen #function[...]}
```
This functionality can be extended by specifying new types as implementations of
the multimethod `reify-symbolspec`, although it's recommended that for any
library authors who do so, namespaced keywords be used to name types.
## License ## License