Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

defpun

See defpun for an introduction.

The following symbols are exported by the lparallel.defpun package as well as by the convenience package lparallel .


[macro] declaim-defpun &rest names

See `defpun’.

[macro] defpun name params &body body

`defpun’ defines a function which is specially geared for fine-grained parallelism. If you have many small tasks which bog down the system, `defpun’ may help.

The syntax of `defpun’ matches that of `defun’. The difference is that `plet’ and `plet-if’ take on new meaning inside `defpun’. The symbols in the binding positions of `plet’ and `plet-if’ should be viewed as lazily evaluated immutable references.

Inside a `defpun’ form the name of the function being defined is a macrolet, as are the names of other functions which were defined by `defpun’. Thus using #’ on them is an error. Calls to functions defined by `defpun’ entail more overhead when the caller lies outside a `defpun’ form.

A `defpun’ function must exist before it is referenced inside another `defpun’ function. If this is not possible–for example if func1 and func2 reference each other–then use `declaim-defpun’ to specify intent:

(declaim-defpun func1 func2)

[macro] defpun/type name params arg-types return-type &body body

Typed version of `defpun’.

`arg-types’ is an unevaluated list of argument types.

`return-type’ is an unevaluated form of the return type, possibly indicating multiple values as in (values fixnum float).

(As a technical point, if `return-type’ contains no lambda list keywords then the return type given to ftype will be additionally constrained to match the number of return values specified.)

[macro] plet bindings &body body

The syntax of `plet’ matches that of `let’.

plet ({var-no-init | (var [init-form])}*) declaration* form*

For each (var init-form) pair, a future is created which executes `init-form’. Inside `body’, `var’ is a symbol macro which expands to a `force’ form for the corresponding future.

Each `var-no-init’ is bound to nil and each `var’ without `init-form’ is bound to nil (no future is created).

Type declarations for vars are recognized by `plet’ and incorporated into the final expansion. The semantics of these declarations are the same as those of a regular `let’ form.

`plet’ is subject to optimization inside `defpun’.

[macro] plet-if predicate bindings &body body

The syntax of `plet-if’ matches that of `let’ except for the addition of the `predicate’ form.

If `predicate’ evaluates to true, the behavior is the same as `plet’.

If `predicate’ evaluates to false, the behavior is the same as `let’.

`plet-if’ is subject to optimization inside `defpun’.