► |  | The Racket Foreign Interface

1 | Overview
2 | Loading Foreign Libraries
3 | C Types
4 | Pointer Functions
5 | Derived Utilities
6 | Miscellaneous Support
7 | Unexported Primitive Functions
| Bibliography
| Index

▼ | 5 | Derived Utilities

5.1 | Safe Homogenous Vectors
5.2 | Safe C Vectors
5.3 | Tagged C Pointer Types
5.4 | Serializable C Struct Types
5.5 | Defining Bindings
5.6 | Allocation and Finalization
5.7 | Custodian Shutdown Registration
5.8 | Atomic Execution
5.9 | Speculatively Atomic Execution
5.10 | Process-Wide Registration
5.11 | Objective-C FFI
5.12 | Cocoa Foundation
5.13 | COM (Common Object Model)
5.14 | File Security-Guard Checks
5.15 | Windows API Helpers

► | 5.5 | Defining Bindings

5.5.1 | FFI Identifier Conventions

On this page:

define-ffi-definer
make-not-available
provide-protected
5.5.1`` FFI Identifier Conventions
convention: hyphen->underscore
convention: hyphen->camelcase

top ← prev up next →

#### 5.5`` Defining Bindings

(require ffi/unsafe/define) | package: base

> > syntax

> > (define-ffi-definer define-id ffi-lib-expr
> > option ...)

> option |  | = |  | #:provide provide-id
> |  | | |  | #:define core-define-id
> |  | | |  | #:default-make-fail default-make-fail-expr
> |  | | |  | #:make-c-id make-c-id

Binds define-id as a definition form to extract bindings from the library produced by ffi-lib-expr. The syntax of define-id is

> > (define-id id type-expr
> > bind-option ...)

> > bind-option |  | = |  | #:c-id c-id
> > |  | | |  | #:wrap wrap-expr
> > |  | | |  | #:make-fail make-fail-expr
> > |  | | |  | #:fail fail-expr

A define-id form binds id by extracting a binding with the name c-id from the library produced by ffi-lib-expr, where c-id defaults to id. The other options support further wrapping and configuration:

- Before the extracted result is bound as id, it is passed to the result of wrap-expr, which defaults to values. Expressions such as (allocator delete) or (deallocator) are useful as wrap-exprs.

- The #:make-fail and #:fail options are mutually exclusive; if make-fail-expr is provided, it is applied to 'id to obtain the last argument to get-ffi-obj; if fail-expr is provided, it is supplied directly as the last argument to get-ffi-obj. The make-not-available function is useful as make-fail-expr to cause a use of id to report an error when it is applied if c-id was not found in the foreign library.

- If provided, the #:make-c-id option changes the default behavior of c-id using an ffi identifier convention, such as converting hyphens to underscores or camel case. Several conventions are provided by ffi/unsafe/define/conventions.

If provide-id is provided to define-ffi-definer, then define-id also provides its binding using provide-id. The provide-protected form is usually a good choice for provide-id.

If core-define-id is provided to define-ffi-definer, then core-define-id is used in place of define in the expansion of define-id for each binding.

If default-make-fail-expr is provided to define-ffi-definer, it serves as the default #:make-fail value for define-id.

For example,

> (define-ffi-definer define-gtk gtk-lib)

binds define-gtk to extract FFI bindings from gtk-lib, so that gtk_rc_parse could be bound as

> (define-gtk gtk_rc_parse (_fun _path -> _void))

If gtk_rc_parse is not found, then define-gtk reports an error immediately. If define-gtk is instead defined with

> (define-ffi-definer define-gtk gtk-lib
> #:default-make-fail make-not-available)

then if gtk_rc_parse is not found in gtk-lib, an error is reported only when gtk_rc_parse is called.

Changed in version 6.9.0.5 of package base: Added #:make-c-id parameter.

> > procedure

> > (make-not-available name) → (#:rest list? -> any/c)

> name : symbol?

Returns a procedure that takes any number of arguments and reports an error message from name. This function is intended for using with #:make-fail or #:default-make-fail in define-ffi-definer

> > syntax

> > (provide-protected provide-spec ...)

Equivalent to (provide (protect-out provide-spec ...)). The provide-protected identifier is useful with #:provide in define-ffi-definer.

##### 5.5.1`` FFI Identifier Conventions

(require ffi/unsafe/define/conventions) | package: base

This module provides several FFI identifier conventions for use with #:make-c-id in define-ffi-definer. A FFI identifier convention is any syntax transformer that converts one identifier to another.

Added in version 6.9.0.5 of package base.

> > syntax

> > convention:hyphen->underscore

A convention that converts hyphens in an identifier to underscores. For example, the identifier gtk-rc-parse will transform to gkt_rc_parse.

> (define-ffi-definer define-gtk gtk-lib
> #:make-c-id convention:hyphen->underscore)
> (define-gtk gtk-rc-parse (_fun _path -> _void))

> > syntax

> > convention:hyphen->camelcase

Similar to convention:hyphen->underscore, but converts the identifier to camel case instead, following the string-titlecase function. For example, the identifier camelCaseVariable will transform to came-case-variable.

> (define-ffi-definer define-calib camel-lib
> #:make-c-id conventon:hyphen->camelcase)
> (define-calib camel-case-variable (_fun -> _void))

top ← prev up next →