Thanks Taylan,

> On 18. Mar 2020, at 07:12, Taylan Kammer <taylan.kam...@gmail.com> wrote:
> 
> On 18.03.2020 00:50, Massimiliano Gubinelli wrote:
>> (let ((a (values "a" "b" "c"))) a)
> 
> The result of (values x y z) is not a kind of object that contains three 
> values (like a list or vector).  It's three separate values that would need 
> to be put into three separate variables.  But you're only naming one variable 
> (a).  So strictly speaking the code is "wrong".
> 
> In Guile 1.8, multiple values were actually put into some special kind of 
> object (which was not very efficient) so code like that still somehow worked 
> even thought it's technically wrong.
> 
> Starting from Guile 2.0, providing multiple values in a context where only 
> one is expected causes the extra values to be ignored.
> 
> 

I understand the point but then it comes to the problem how to handle this in 
macros. For example if bar is a proceduce which returns multiple values and I 
have a macro "my-macro" which wraps the call with some initialization and 
finalization code and I write

(my-macro (bar))

how to write this macro without knowing if bar is returning multiple values or 
not? For example I would like the code above to expand into

(begin
 (initialization-code)
 (let ((ret (bar))) 
  (finalization-code) 
  ret))


But this does not work as shown by the example above. How to implement this 
macro correctly?

best
Max


> Happy to answer further questions about this.  Multiple-values can be a 
> tricky concept to grasp because most other programming languages don't have 
> it.
> 
> - Taylan


Reply via email to