Simple bindings are as in let*. Destructuring is done if the first item
in a binding is a list. Multiple value binding is done if the first item
in a binding is a list and the first item in the list is ’:values’. Other
forms have their own syntax. For example, :structure first has the conc
name and then slot names whereas :flet has the function name and a list
of arguments and then the function body (in an implicit progn).

Fluid-bind is an extension of bind that handles setting and resetting places. For example, suppose that an object of class foo has a slot named bar whose value is currently 3. The following code would evaluate the inner body with bar bound to 17 and restore it when the inner body is exited.

This binding form tells to expand clauses whose first element is
a symbol using ‘let‘. (It also gets ‘bind‘ to signal an error if
the first element is a keyword that doesn’t have a defined binding
form.)

‘kind‘ specifies the binding form. It can be a type (e.g., symbol or array)
or a keyword (e.g., :flet or :plist). ‘variable-form‘ and ‘value-form‘ are
taken from the binding-form given to ‘bind‘. E.g., if you have a bind like

then ‘kind‘ will be :values, ‘variable-form‘ will be the list ‘(a b c)‘ and
‘value-form‘ will be the expression ‘(foo)‘. ‘bind-generate-bindings‘
uses these variables as data to construct the generated code.