[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Function argument order of evaluation
From: |
YUE Daian |
Subject: |
Re: Function argument order of evaluation |
Date: |
Mon, 11 Feb 2019 22:54:31 +0800 |
On 2019-02-11 10:53, Tadeus Prastowo <tadeus.prastowo@unitn.it> wrote:
> Hello,
>
> In C/C++, the following code has an undefined behavior (UB):
>
> int my_var = 1;
> my_function((my_var = 10), 2 * my_var);
>
> It is because their respective standards do not specify that the
> assignment `(my_var = 10)' as the first argument must be evaluated
> before the second argument `2 * my_var' is evaluated. So,
> `my_function' can see as its arguments either `10' and `20' or `10'
> and `2'. Compiling the following code with GCC 5.5 that comes with
> Ubuntu 16.04 gives the latter:
>
> #include <stdio.h>
> void my_function(int a, int b) {
> printf("%d, %d\n", a, b);
> }
> int main() {
> int my_var = 1;
> my_function((my_var = 10), 2 * my_var);
> return 0;
> }
>
> Does Emacs Lisp behave the same or does it provide a guarantee that
> the function arguments are always evaluated from left to right?
>
> I have searched Emacs Lisp manual and the archive of this mailing list
> for the keyword "order of evaluation" but have not found the answer.
> So, I ask directly here. Sorry if I might have missed the obvious.
>
> Thank you for your kind help.
>
> --
> Best regards,
> Tadeus
Hi Tadeus,
>From the Emacs Lisp reference:
...then the forms in the function body are evaluated in order, and the
value of the last body form becomes the value of the function call.
You see, the forms in the function body are evaluated *in order*.
I think it can be treated as a guarantee? ;-)
Reference:
https://ftp.gnu.org/old-gnu/Manuals/elisp-manual-20-2.5/html_chapter/elisp_9.html#SEC114
Danny