[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

New "issue" and proposal



Issue:        FUNCTION-CALL-EVALUATION-ORDER
References:   none
Category:     CLARIFICATION
Edit history: Version 1 by Clinger (22 March 1988)

Problem Description:

CLtL does not say whether the function expression of a call is evaluated
before or after the argument expressions.

Proposal (FUNCTION-CALL-EVALUATION-ORDER:UNSPECIFIED):

Common Lisp does not specify whether the function expression of a call is
evaluated before or after the argument expressions.  Programs that rely on
a particular order of evaluation are in error.

Example:

(defun foo (x) (+ x 3))
(defun bar () (setf (symbol-function 'foo) #'(lambda (x) (+ x 4))))
(foo (progn (bar) 20))
; may return 23 or 24

Rationale:

This makes the status quo explicit.

Current Practice:

TI and Symbolics evaluate the function expression last.  Lucid and Coral
sometimes evaluate the function expression first and at other times evaluate
the function expression last.

Cost to implementors:

None.

Cost to users:

None.

Benefits:

Codifies an ambiguity.

Aesthetics:

Since Common Lisp evaluates argument expressions from left to right, it would
be more consistent for the function expression to be evaluated before the
argument expressions.  On the other hand, the evaluation rules for function
expressions are already quite different from the rules for argument
expressions, and nobody in their right mind would write code that depends on
the order of evaluation, so aesthetics should not count for much in this case.
Requiring left to right evaluation would force some implementations to consume
an extra register for many function calls.  The efficiency argument seems more
important than the aesthetic argument.