这是我在Scheme中的第二个问题。说我有2个列表
'("a" "b" "c")
'("e" "f" "g")
我想以这种方式组合它们:
'(("a" "e") ("b" "f") ("c" "g"))
这可能吗?
答案 0 :(得分:1)
您使用SRFI-1 List library。函数名称为zip
。当您apply
zip
到zip
结果时,您会回到您开始的位置,因此unzip
通常是相同的过程,除了它需要列表列表而不是很多列表参数。
(zip '(1 2 3) '(a b c)) ; ==> ((1 a) (2 b) (3 c))
(unzip '((1 2 3) (a b c))) ; ==> ((1 a) (2 b) (3 c))
(unzip '((1 a) (2 b) (3 c))) ; ==> ((1 2 3) (a b c))
如果您点击该链接,您将找到参考实施。但是,您通常不需要它,因为大多数实现都包含它们。例如。在Racket R6RS中,您(import (srfi :1))
或使用您(require srfi/1)
的球拍语言。在Chicken (declare (uses srfi-1))
中,所以实现之间的语法差别很大。
您标记了lisp
因此,为了完整性,Common Lisp实现将如下所示:
(defun zip (&rest lsts)
(apply #'mapcar #'list lsts))
(defun unzip (lsts)
(apply #'mapcar #'list lsts))