我有一个函数返回两个拆分列表,如下所示:
((1 . 2) (3 . 4) (5 . 7))
((8 . 9) (10 . 23) (30 . 20))
Run Code Online (Sandbox Code Playgroud)
是否有像python一样的常见lisp资源
a,b = 1,2
a = 1
b = 2
Run Code Online (Sandbox Code Playgroud)
jki*_*ski 11
有两种选择.首先,您可以使用返回多个值VALUES
.然后,您可以使用MULTIPLE-VALUE-BIND
将返回值绑定到不同的变量.
(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))
Run Code Online (Sandbox Code Playgroud)
这与Python略有不同,因为您可以调用该函数,就好像它只返回一个值一样,其他值将被静默丢弃.当第一个值本身有意义时,通常使用多个返回值,其他值只是补充信息(例如,参见参考资料FLOOR
).
在这种情况下,似乎这两个值彼此相关(因此仅使用第一个值永远不会有意义).因此,在这种情况下,最好返回一个列表或一个cons-cell.您可以使用DESTRUCTURING-BIND
将元素分配给变量.
(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))
Run Code Online (Sandbox Code Playgroud)