2011-05-16 44 views
12

有沒有一種方法可以將列表的值分配給Common Lisp中的符號列表,類似於您可以將元組的值分配給Python中的變量的方式嗎?元組解包與Python類似,但在Common Lisp中

x, y, z = (1, 2, 3) 

喜歡的東西

(setq '(n p) '(1 2)) 

np現在分別等於12。以上只是我腦海中想到的,但它不起作用。我嘗試使用應用如下:

(apply setq '('(n p) '(1 2))) 

我是新來的Lisp,因此,如果這是什麼,是公然明顯的,儘量不要太苛刻,並請點我在正確的方向!謝謝。 PS:我在Scheme中做過這樣的事,在Common Lisp中也有類似的元組擴展,但這些在回答我的問題方面沒有太大的幫助1)因爲我沒有使用Scheme, 2)因爲排名最高的答案只是apply這個詞。

回答

12

使用DESTRUCTURING-BIND,它可以完成比元組解包更多的操作。像關鍵字分配和可選參數等。真的,你可以用一個函數的參數列表來做任何事情。

但是,如果你沒有真正有一個列表來解構,並希望一次設置一組變量,使用PSETF

 
(psetf n 1 
     p 2) 

您還可以使用SETF,但PSETF是一個更接近模擬元組賦值:例如,它用於交換/置換值。

# Python 
n, p = p, n 
x, y, z = z, x, y 
 
;; Lisp 
(psetf n p 
     p n) 
(psetf x z 
     y x 
     z y) 

其實你很可能逃脫一個平凡的LET。

另外,不要爲SETQ而煩惱任何事情。使用SETF/PSETF是因爲它們更好,而且是執行某些類型的分配的唯一方法。

+2

對於交換和旋轉,有'rotatef':'(rotatef n p)','(rotatef x y z)'。 – Svante 2011-05-16 09:58:36

9

聽起來像destructuring-bind(它的方式在底部)可能會做你想做的。

另外,HyperSpec的描述,但我認爲其他鏈接表明它更好。

(destructuring-bind (x y z) (list 1 2 3) (+ x y z)) 
6

對於您有一個列表並希望將其值分配給多個變量的情況,DESTRUCTURING-BIND是要走的路。

但是,對於pythonic「返回一個列表或元組,使用變量的列表或元組來分配」的情況下,它(可能)會使用多個返回值和多值VALUE BIND。