同时为多个地方分配相同的值?

147*_*7pm 2 common-lisp

我想分配两个(或更多)变量,例如,xy(z等)从用户输入读取的相同值.现在我有(setf x (read)),但我也想输入输入值y.我必须这样做(setf y x)吗?有更优雅的东西吗?

(setf x (read) y (read))
Run Code Online (Sandbox Code Playgroud)

只使用户输入两次,所以这没有用.

Jos*_*lor 5

尽管你可以很容易地实现它,但没有什么能像内置于语言中那样.例如,这里是一个宏setf*(不是最好的名字),它为一堆地方(不必是变量)分配一个值:

(defmacro setf* ((&rest places) value)
  (let ((temp (gensym)))
    `(let ((,temp ,value))
       (setf ,@(mapcan (lambda (place)
                         (list place temp))
                       places)))))
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

你做的

(setf* (x y) (read))
Run Code Online (Sandbox Code Playgroud)

当然,对于一个简单的关闭,你也可以手动执行此操作(如sds建议):

(setf x (read)
      y x)
Run Code Online (Sandbox Code Playgroud)

要么

(let ((temp (read)))
  (setf x temp
        y temp))
Run Code Online (Sandbox Code Playgroud)