Mark H Weaver <[email protected]> writes: > Marco Maggi <[email protected]> writes: > >> Yes, but it depends on what is "natural" for you. In >> Vicare, when calling a Scheme function, all the arguments >> are pushed on the Scheme stack segment (similar to calling a >> C function) and then the function is called; the callee >> takes the leftover arguments and puts them into a newly >> allocated list. > > Indeed, and Guile 2 also does this in compiled code.
I see. So the allocation of the new list is the responsibility of the function prologue of functions defined with rest arguments. Thanks for the explanation. And somthing similar could be done even if the calling convention is the "natural" one, that the caller conses the arguments onto a list as they are evaluated, and passes that list to the implementation of the procedure. The function prologue in the callee would then extract arguments from that list, and only in the case that the function is defined with a rest argument, the prologue calls list-copy. And the compiler could even omit that list-copy in cases where it can infer that the list cannot be subject to any mutations. (It's long time since I played with lisp/scheme implementation, but then I considered a calling convention where each procedure (and continuation) would have two entry points, one with a single argument passed in a register, and a second entry point where a pointer to an argument list is passed in that register. The first entry point would be used in the common case that there's a single argument or a single return value. While the second entry point would be used when the number of arguments is different from 1. Depending on number of arguments accepted, one or the other of the entry points may point directly to code raising an error). Regards, /Niels -- Niels Möller. PGP-encrypted email is preferred. Keyid C0B98E26. Internet email is subject to wholesale government surveillance.
