Exchange symbols

For the Compleat Fan
Locked
cormullion
Posts: 2038
Joined: Tue Nov 29, 2005 8:28 pm
Location: latiitude 50N longitude 3W
Contact:

Exchange symbols

Post by cormullion »

is there a way of swapping two symbols' values?

Code: Select all

(set 'x 1 'y 2)

(? x y)

; x is 2, y is 1
without having to do this:

Code: Select all

(set 't x 'x y 'y t)

Fanda
Posts: 253
Joined: Tue Aug 02, 2005 6:40 am
Contact:

Post by Fanda »

I haven't tested speed, but this works:

Code: Select all

> (set 'x 1 'y 2) 
2
> (map set '(x y) (list y x))
(2 1)
> x
2
> y
1
You can also put it in a macro:

Code: Select all

> (define-macro (exchange) (map set (args) (map eval (rotate (args) -1))))
(lambda-macro () (map set (args) (map eval (rotate (args) -1))))

> (set 'a 1 'b 2 'c 3 'd 4)
4
> (exchange a b c d)
(2 3 4 1)
> a
2
> b
3
> c
4
> d
1
Fanda

cormullion
Posts: 2038
Joined: Tue Nov 29, 2005 8:28 pm
Location: latiitude 50N longitude 3W
Contact:

Post by cormullion »

Nice solutions, thanks Fanda!

I assume there's no parallel assignments in newLISP 'out of the box' then?

cormullion
Posts: 2038
Joined: Tue Nov 29, 2005 8:28 pm
Location: latiitude 50N longitude 3W
Contact:

Post by cormullion »

You can do this:

Code: Select all

(set 'x 1 'y 2) 
; x is 1, y is 2

(swap  x y)
; x is 2, y is 1
as of 8.9.13.

It pays to read the release notes!

Thanks Lutz - I like the way you grant my wishes...!

Locked