我想分配两个(或更多)变量,例如x
和y
(z
等)从用户输入读取的相同值。现在我有(setf x (read))
,但我也希望将输入值放在y
中。我必须做(setf y x)
吗?还有更优雅的东西吗?
(setf x (read) y (read))
只会使用户输入两次,因此没有用。
答案 0 :(得分:5)
虽然你可以很容易地实现它,但它并没有像语言中那样。例如,这里有一个宏 setf * (不是最好的名字),它为一堆地方(不必是变量)分配一个值:< / p>
(defmacro setf* ((&rest places) value)
(let ((temp (gensym)))
`(let ((,temp ,value))
(setf ,@(mapcan (lambda (place)
(list place temp))
places)))))
CL-USER> (macroexpand-1 '(setf* (a (car list) (aref array 2 3)) d))
(LET ((#:G1043 D))
(SETF A #:G1043
(CAR LIST) #:G1043
(AREF ARRAY 2 3) #:G1043))
你做
(setf* (x y) (read))
当然,对于一个简单的关闭,你也可以手动执行此操作(如sds建议的那样):
(setf x (read)
y x)
或
(let ((temp (read)))
(setf x temp
y temp))
答案 1 :(得分:3)
您可以使用相同的格式将x
分配给y
:
(setf x (read) y x)