<\body> The client APIs for the various GNUnet services have similar APIs. To avoid redundantly restating the API for each service type, the common patterns are stated here once and are referenced by the service-specific documentation. GNUnet has many . The module responsible for interacting with the service is conventionally named , where depends on the service. To use a service, it needs to be to, with a procedure named and some optional keyword arguments. This procedure can be called as #:connected #:disconnected )>. It returns a \U for each service, there is a different type of server object. The connection is made asynchronuously; the thunk will be called when the connection has actually been made. When the connection is lost, the (optional) thunk is called and the implementation will retry connecting. To close the current connection, if any, and stop reconnecting, the idempotent procedure can be called on the server object. The server object will also be disconnected after the server object becomes unreachable. Service types can support or require additional arguments. <\todo> todo ) > Records in Scheme-GNUnet often contain bytevector slices. When constructing such a record, it would be inefficient to copy the whole bytevector slice. As such, constructors of such record types typically don't do that, then. At the same time, it usually is expected that the record is fully immutable, and hence that the contents of the slices it contains don't change over time. However, sometimes the slices do change over time so a copy needs to made even if it is somewhat inefficient. Therefore, these record types have two constructors: a constructor conventionally named that does not make a copy and requires that the slices are unmodified as long as the constructed object remains in use, and a constructor conventionally named that does make a copy and does not impose such requirements. Sometimes, you receive a record that is only valid for a limited duration, because afterwards the slices will be modified. To extend the duration, it then is required to make a of the record that contains a copy of the bytevector slices, and use the copy instead of the original. Procedures for making such copies are conventionally named , can be called as )> and return the copy. These kind of record types are called in Scheme-GNUnet. You can contribute to Scheme-GNUnet by finding a better acronym. As the records are immutable, field accessors for slices will always return a read-only bytevector slice, even if a read-write bytevector slice was passed to the constructor and even if the copying constructor was used. Because bytevector slices cannot be compared with , the same holds for types. Instead, types define their own equality procedures, conventionally named . <\initial> <\collection>