如何在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中将返回的元组绑定到多个变量?”或“如何返回多个值并在以后绑定它们?”。我希望你同意这一点。