Nyquist / XLISP 2.0  -  Contents | Tutorials | Examples | Reference

cl:multiple-value-call


The cl:multiple-value-call macro applies a function to a list of return values:

(cl:multiple-value-call function [expr1 ...])
function - a Lisp expression evaluating to a function call
exprN - arbitrary Lisp expressions
returns - the values returned by the function

(defmacro cl:multiple-value-call (function &rest exprs)
  (let (args)
    (dolist (expr exprs)
      (setq  cl:*multiple-values* nil)
      (let* ((result (eval expr)))
        (if cl:*multiple-values*
            (dolist (rslt *rslt*) (push rslt args))
            (push result args))))
    (setq args (reverse args))
    `(progn
       (setq cl:*multiple-values* nil)
       (apply ,function ',args)))

The cl:multiple-value-call macro first evaluates the expressions and collects all return values in a single list, then the 'function' form is evaluated and the resulting function call is applied to the list of values.

Before applying the function to the list of values the cl:*multiple-values* variable is set to NIL, the final value of cl:*multiple-values* depends on the 'function' argument.

Examples:

> (funcall #'+
    (cl:values 1 2)
    (cl:values 3 4))
4  ; (apply #'+ (1 3))

> (cl:multiple-value-call #'+
    (cl:values 1 2)
    (cl:values 3 4))
10  ; (apply #'+ (1 2 3 4))

  Back to top


Nyquist / XLISP 2.0  -  Contents | Tutorials | Examples | Reference