如何在common lisp中处理多个返回

如何在common lisp中处理多个返回,lisp,common-lisp,Lisp,Common Lisp,我有一个返回两个拆分列表的函数,如下所示: ((1 . 2) (3 . 4) (5 . 7)) ((8 . 9) (10 . 23) (30 . 20)) 在common lisp中是否有类似python的资源 a,b = 1,2 a = 1 b = 2 有两种选择。首先,可以使用返回多个值。然后可以使用将返回值绑定到不同的变量 (defun foo () (values '((1 . 2) (3 . 4) (5 . 7)) '((8 . 9) (10 . 23)

我有一个返回两个拆分列表的函数,如下所示:

((1 . 2) (3 . 4) (5 . 7))
((8 . 9) (10 . 23) (30 . 20))
在common lisp中是否有类似python的资源

a,b = 1,2
a = 1 
b = 2 

有两种选择。首先,可以使用返回多个值。然后可以使用将返回值绑定到不同的变量

(defun foo ()
  (values '((1 . 2) (3 . 4) (5 . 7))
          '((8 . 9) (10 . 23) (30 . 20))))

(multiple-value-bind (a b) (foo)
  (format t "~&A: ~s~%B: ~s~%" a b))
; A: ((1 . 2) (3 . 4) (5 . 7))
; B: ((8 . 9) (10 . 23) (30 . 20))
(defun bar ()
  (list '((1 . 2) (3 . 4) (5 . 7))
        '((8 . 9) (10 . 23) (30 . 20))))

(destructuring-bind (a b) (bar)
  (format t "~&A: ~s~%B: ~s~%" a b))
; A: ((1 . 2) (3 . 4) (5 . 7))
; B: ((8 . 9) (10 . 23) (30 . 20))
这与Python有点不同,因为您可以调用函数,就好像它只返回一个值一样,而其他值将被默默地丢弃。当第一个值本身有意义,而其他值只是补充信息时,通常使用多个返回值(参见示例)

在这种情况下,这两个值似乎相互关联(因此仅使用第一个值是没有意义的)。因此,在这种情况下,最好返回一个列表或cons单元格。可以使用将元素指定给变量

(defun foo ()
  (values '((1 . 2) (3 . 4) (5 . 7))
          '((8 . 9) (10 . 23) (30 . 20))))

(multiple-value-bind (a b) (foo)
  (format t "~&A: ~s~%B: ~s~%" a b))
; A: ((1 . 2) (3 . 4) (5 . 7))
; B: ((8 . 9) (10 . 23) (30 . 20))
(defun bar ()
  (list '((1 . 2) (3 . 4) (5 . 7))
        '((8 . 9) (10 . 23) (30 . 20))))

(destructuring-bind (a b) (bar)
  (format t "~&A: ~s~%B: ~s~%" a b))
; A: ((1 . 2) (3 . 4) (5 . 7))
; B: ((8 . 9) (10 . 23) (30 . 20))

如果您已经有两个变量
a
b
,则可以指定值:

CL-USER 6 > (let ((a 10)
                  (b 3))

              (multiple-value-setq (a b) (truncate a b))

              (list a b))
(3 1)
或者使用
SETF

CL-USER 7 > (let ((a 10)
                  (b 3))

              (setf (values a b) (truncate a b))

              (list a b))
(3 1)

您可以尝试返回
(cons a b)
,并使用
car
cdr
获取2个值问题标题的可能重复项有点误导,它更能自我解释,例如“如何在公共Lisp中将返回的元组绑定到多个变量?”或“如何返回多个值并在以后绑定它们?”。我希望你同意这一点。