Parallel Assignment
January 11, 2019
Recently, I was writing a program where I needed parallel assignment; the details of my program don’t matter. Some languages provide parallel assignment natively; for instance, Python:
Python 2.7.13 (default, Mar 13 2017, 20:56:15) [GCC 5.4.0] on cygwin Type "help", "copyright", "credits" or "license" for more information. >>> a,b,c = 1,2,3 >>> print a,b,c 1 2 3 >>> a,b,c = b,c,a >>> print a,b,c 2 3 1
You can do something similar in C (I think — I’m not sufficiently expert in C to be certain this works):
#define SWAP(x, y) { typeof(x) t = x; x = y; y = t }
Your task is to add parallel assignment to your favorite programming language. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
The code in C in your email above does a swap of the values of x and y using t as temporary storage. C does not have parallel assignment
Well, you can do something similar to my C++ solution with a macro in C (assuming some compiler extensions):
That should be “typeof(e1) _e1 = …” of course. And swap should be SWAP if we use the convention that macros that evaluate their arguments multiple times should be in upper case.
I wrote this before reading the solution by @programmingpraxis
(Dybvig’s pset!). It’s not as clever as that one but I think it works
as needed.
Here’s a solution in Common Lisp.
Example Usage:
I didn’t realize the editor was using tabs. Here’s the same code, hopefully properly formatted (indented) this time.
Example usage:
Common Lisp already has PSETQ and PSETF.
(psetq a b b a) ; swap a and b
(psetf (aref v i) (aref v j) (aref v j) (aref v i)) ; swap a[i] and a[j]