Lispでswap

Lispは詳しくないのだけど、symbol使えば普通にかけるのではなかろうか。

(defun swap (a b)
  (let ((c (symbol-value a))
	(d (symbol-value b)))
    (list 
     (set a d)
     (set b c))))

(setq x 10
      y 20)

(list x y)
=> (10 20)
(swap 'x 'y)
=> (20 10)
(list x y)
=> (20 10)

まぁ、Common Lispはレキシカルスコープを採用しているので、スペシャル変数以外はうまく動かないのだけれど。逆に Emacs Lispはダイナミックスコープだから大丈夫だったり。