如何在common lisp中从一个具有奇偶对的列表创建列表列表

如何在common lisp中从一个具有奇偶对的列表创建列表列表,lisp,common-lisp,Lisp,Common Lisp,我是Lisp编程新手,尝试从Lisp中的一个列表中创建子列表,并从列表中创建一对奇数和偶数。例如: 我有一张单子 ListA ("a" "b" "c" "d" "e" "f" "g" "h") 现在我想转换为以下列表: enter code here ListB ( ("a" "b") ("c" "d") ("e" "f") ("g" "h") ) 因此,始终将生成值为((第1秒)(第三四)(第五六)的子列表 我尝试了多种方法,例如先取出奇数项,甚至项目分开,并使用了函数(list(od

我是Lisp编程新手,尝试从Lisp中的一个列表中创建子列表,并从列表中创建一对奇数和偶数。例如: 我有一张单子

ListA ("a" "b" "c" "d" "e" "f" "g" "h") 
现在我想转换为以下列表:

enter code here
ListB  ( ("a" "b") ("c" "d") ("e" "f") ("g" "h") )
因此,始终将生成值为((第1秒)(第三四)(第五六)的子列表


我尝试了多种方法,例如先取出奇数项,甚至项目分开,并使用了函数(list(odlist evenlist)),但在上面的列表中没有达到预期值。在这方面,有人能帮我吗。非常感谢您的帮助。

您需要制定一个程序来执行以下操作:

  • 参数为()时的句柄。通常结果是()
  • 默认情况下,处理两个链中的一个链。例如,
    (cons(在此处列出“a”和“b”)递归调用)
  • 因此,
    (“g”“h”)
    的结果变为
    (cons(列出“g”“h”)())
    ,如果将其添加到递归调用中,则会得到:

    (cons (list "a" "b") 
          (cons (list "c" "d") 
                (cons (list "e" "f") 
                      (cons (list "g" "h") ())))) 
    ; ==> (("a" "b") ("c" "d") ("e" "f") ("g" "h"))
    

    如果您已经按照您的建议将偶数元素与奇数元素分开,那么下一步将是:

    (mapcar #'list evenlist oddlist)
    
    哪一个先到,
    evenlist
    oddlist
    ,取决于您是从0开始计数还是从1开始计数

    或者,整个问题可以通过一个
    循环
    表达式来解决:

    (loop for head = '(a b c d e f g h i j k l m n o p) then (cddr head)
       until (null head)
         if (= (length head) 1) collect head
         else collect (subseq head 0 2))
    
    这实际上是非常短的循环

    (loop for (x y) on '(a b c d e f) by #'cddr
          collect (list x y))
    ;=> ((A B) (C D) (E F))
    
    如果元素的数目为奇数,则在最后一对中会给出零,但您没有提到在这种情况下会发生什么:

    (loop for (x y) on '(a b c d e f g ) by #'cddr
          collect (list x y))
    ;=> ((A B) (C D) (E F) (G NIL))
    

    对于一个包含奇数个元素的列表,结果应该是什么?我通常不会指出拼写错误,但请注意,该语言是“Common Lisp”,而不是“Comman Lisp”,或(如“Conman Lisp”)。(虽然可能有一些骗子口齿不清)这是一个比这里需要的更复杂的循环使用。您可以通过#“cddr采集(列表x y)”
    (循环(x y)(a b c d e f))
    ,正如我在中所示。@JoshuaTaylor谢谢,我不知道
    循环
    可以做到这一点。我已经在PLaneT上更正了我的
    循环
    宏的Racket实现,所以它也可以在那里工作。非常感谢Joshua!工作得很好。非常抱歉打错了