同时为多个地方分配相同的值?
Simultaneously assign same value to multiple places?
我想为两个(或更多)变量分配从用户输入读取的相同值,例如 x
和 y
(z
等)。现在我有 (setf x (read))
,但我也想将输入值也放入 y
。然后我必须做 (setf y x)
吗?有没有更优雅的东西?
(setf x (read) y (read))
只会让用户输入两次,这样不好。
您可以以相同的形式将 x
分配给 y
:
(setf x (read) y x)
尽管您可以轻松地实现它,但语言中内置的功能与此完全不同。例如,这里有一个宏 setf*(虽然不是最好的名字),它将一个值分配给一堆地方(不一定是变量):
(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))
我想为两个(或更多)变量分配从用户输入读取的相同值,例如 x
和 y
(z
等)。现在我有 (setf x (read))
,但我也想将输入值也放入 y
。然后我必须做 (setf y x)
吗?有没有更优雅的东西?
(setf x (read) y (read))
只会让用户输入两次,这样不好。
您可以以相同的形式将 x
分配给 y
:
(setf x (read) y x)
尽管您可以轻松地实现它,但语言中内置的功能与此完全不同。例如,这里有一个宏 setf*(虽然不是最好的名字),它将一个值分配给一堆地方(不一定是变量):
(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))