Common lisp Car:6不是列表错误

Common lisp Car:6不是列表错误,common-lisp,clisp,Common Lisp,Clisp,我正在尝试用CLisp编写一个程序,它可以完美地洗牌这两个列表。下面是我的程序。当我将输入作为(shuffle'(1234)-(456))输入程序时。它给出了一个错误car:6不是一个列表 (defun len (list) (if list (1+ (len (cdr list))) 0)) (defun my-append (A1 A2) (cond ((null A1) A2) (t (cons A1 A2))) )

我正在尝试用CLisp编写一个程序,它可以完美地洗牌这两个列表。下面是我的程序。当我将输入作为
(shuffle'(1234)-(456))
输入程序时。它给出了一个错误
car:6不是一个列表

(defun len (list)
  (if list
    (1+ (len (cdr list)))
    0))

(defun my-append (A1 A2)
    (cond
        ((null A1) A2)
        (t (cons A1 A2)))
    )

(defun append (A1 A2)
    (cond
        ((null A2) A1)
        (t (cons (car A1) (append (cdr A1) A2))))
)

(defun shuffle (A1 A2)
    (cond
        ((/= (len A2) (len A1)) (princ "lengths of the lists are not equal"))
        ((and (null A1) (null A2)) (princ "lists shuffled"))
        (t (append
            (my-append (car A1) (car A2)) 
            (shuffle (cdr A1) (cdr A2))
           )
        )
    )
)

有人能帮我吗?

让我们手动执行
(shuffle'(3)'(6))

  • (shuffle'(3)“(6))
    -
  • (append(我的append 36)(无序排列“()”)
    -
  • myappend
    返回
    (cons36)
    ,因此我们有
    (append(cons36)nil)
    -
  • (cons 3(附加6 nil))
    -
  • (cons 3(cons(car 6)nil))
    -
    (car 6)
    会犹豫,因为实际上
    6
    不是一个列表

  • 让我们手动执行
    (shuffle'(3)'(6))

  • (shuffle'(3)“(6))
    -
  • (append(我的append 36)(无序排列“()”)
    -
  • myappend
    返回
    (cons36)
    ,因此我们有
    (append(cons36)nil)
    -
  • (cons 3(附加6 nil))
    -
  • (cons 3(cons(car 6)nil))
    -
    (car 6)
    会犹豫,因为实际上
    6
    不是一个列表

  • stackoverflow社区对这个特定问题的任何特定答案只会帮助您解决这个问题,而不会帮助您解决下一个问题

    您应该问的真正问题是:如何使用公共Lisp调试器?

    由于您正在使用clisp,请熟悉clisp的调试器

  • 尝试
    获取命令列表
  • 使用
    :bt
    获取堆栈跟踪
  • 在这种情况下:

    Break 1 [6]> :bt
    <1/289> #<SYSTEM-FUNCTION SHOW-STACK> 3
    <2/282> #<COMPILED-FUNCTION SYSTEM::PRINT-BACKTRACE>
    <3/276> #<COMPILED-FUNCTION SYSTEM::DEBUG-BACKTRACE>
    <4/267> #<SYSTEM-FUNCTION SYSTEM::READ-EVAL-PRINT> 2
    <5/264> #<COMPILED-FUNCTION SYSTEM::BREAK-LOOP-2-3>
    <6/260> #<SYSTEM-FUNCTION SYSTEM::SAME-ENV-AS> 2
    <7/246> #<COMPILED-FUNCTION SYSTEM::BREAK-LOOP-2>
    <8/244> #<SYSTEM-FUNCTION SYSTEM::DRIVER>
    <9/204> #<COMPILED-FUNCTION SYSTEM::BREAK-LOOP>
    <10/201> #<SYSTEM-FUNCTION INVOKE-DEBUGGER> 1
    <11/191> #<SYSTEM-FUNCTION CAR>
    [190] EVAL frame for form (CAR A1)
    [186] EVAL frame for form (CONS (CAR A1) (APPEND (CDR A1) A2))
    <12/183> #<SPECIAL-OPERATOR COND>
    [182] EVAL frame for form (COND ((NULL A2) A1) (T (CONS (CAR A1) (APPEND (CDR A1) A2))))
    [165] APPLY frame for call (APPEND '6 '"lists shuffled")
    <13/160> 
    #<FUNCTION APPEND (A1 A2) (DECLARE (SYSTEM::IN-DEFUN APPEND))
      (BLOCK APPEND
       (COND ((NULL A2) A1) (T (CONS (CAR A1) (APPEND (CDR A1) A2)))))> 2
    [159] EVAL frame for form (APPEND (CDR A1) A2)
    [154] EVAL frame for form (CONS (CAR A1) (APPEND (CDR A1) A2))
    <14/151> #<SPECIAL-OPERATOR COND>
    [150] EVAL frame for form (COND ((NULL A2) A1) (T (CONS (CAR A1) (APPEND (CDR A1) A2))))
    [133] APPLY frame for call (APPEND '(3 . 6) '"lists shuffled")
    <15/128> 
    #<FUNCTION APPEND (A1 A2) (DECLARE (SYSTEM::IN-DEFUN APPEND))
      (BLOCK APPEND
       (COND ((NULL A2) A1) (T (CONS (CAR A1) (APPEND (CDR A1) A2)))))> 2
    [127] EVAL frame for form (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2)))
    <16/124> #<SPECIAL-OPERATOR COND>
    [123] EVAL frame for form 
    (COND ((/= (LEN A2) (LEN A1)) (PRINC "lengths of the lists are not equal"))
     ((AND (NULL A1) (NULL A2)) (PRINC "lists shuffled"))
     (T (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2)))))
    [106] APPLY frame for call (SHUFFLE '(3) '(6))
    <17/101> 
    #<FUNCTION SHUFFLE (A1 A2) (DECLARE (SYSTEM::IN-DEFUN SHUFFLE))
      (BLOCK SHUFFLE
       (COND
        ((/= (LEN A2) (LEN A1)) (PRINC "lengths of the lists are not equal"))
        ((AND (NULL A1) (NULL A2)) (PRINC "lists shuffled"))
        (T
         (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2))))))> 2
    [100] EVAL frame for form (SHUFFLE (CDR A1) (CDR A2))
    [94] EVAL frame for form (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2)))
    <18/91> #<SPECIAL-OPERATOR COND>
    [90] EVAL frame for form 
    (COND ((/= (LEN A2) (LEN A1)) (PRINC "lengths of the lists are not equal"))
     ((AND (NULL A1) (NULL A2)) (PRINC "lists shuffled"))
     (T (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2)))))
    [73] APPLY frame for call (SHUFFLE '(2 3) '(5 6))
    <19/68> 
    #<FUNCTION SHUFFLE (A1 A2) (DECLARE (SYSTEM::IN-DEFUN SHUFFLE))
      (BLOCK SHUFFLE
       (COND
        ((/= (LEN A2) (LEN A1)) (PRINC "lengths of the lists are not equal"))
        ((AND (NULL A1) (NULL A2)) (PRINC "lists shuffled"))
        (T
         (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2))))))> 2
    [67] EVAL frame for form (SHUFFLE (CDR A1) (CDR A2))
    [61] EVAL frame for form (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2)))
    <20/58> #<SPECIAL-OPERATOR COND>
    [57] EVAL frame for form 
    (COND ((/= (LEN A2) (LEN A1)) (PRINC "lengths of the lists are not equal"))
     ((AND (NULL A1) (NULL A2)) (PRINC "lists shuffled"))
     (T (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2)))))
    [40] APPLY frame for call (SHUFFLE '(1 2 3) '(4 5 6))
    <21/35> 
    #<FUNCTION SHUFFLE (A1 A2) (DECLARE (SYSTEM::IN-DEFUN SHUFFLE))
      (BLOCK SHUFFLE
       (COND
        ((/= (LEN A2) (LEN A1)) (PRINC "lengths of the lists are not equal"))
        ((AND (NULL A1) (NULL A2)) (PRINC "lists shuffled"))
        (T
         (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2))))))> 2
    [34] EVAL frame for form (SHUFFLE '(1 2 3) '(4 5 6))
    Printed 21 frames
    
    中断1[6]>:bt
    # 3
    #
    #
    # 2
    #
    # 2
    #
    #
    #
    # 1
    #
    [190]模板的评估框架(A1车)
    [186]表格的评估框架(CONS(A1车厢)(附加(CDR A1)A2))
    #
    [182]表格的评估框架(COND((空A2)A1)(T(CONS(CAR A1)(附加(CDR A1)A2)))
    [165]为调用应用帧(附加“6”个“无序列表”)
    # 2
    [159]表格的评估框架(附加(CDR A1)A2)
    [154]表格的评估框架(CONS(A1车厢)(附加(CDR A1)A2))
    #
    [150]表格的评估框架(COND((空A2)A1)(T(CONS(CAR A1)(附加(CDR A1)A2)))
    [133]为调用应用帧(附加“(3.6)“无序列表”)
    # 2
    [127]表单的EVAL帧(APPEND(MY-APPEND(CAR A1)(CAR A2))(SHUFFLE(CDR A1)(CDR A2)))
    #
    [123]表格的评估框架
    (COND((/=(LEN A2)(LEN A1))(PRINC“列表的长度不相等”))
    ((和(空A1)(空A2))(PRINC“无序列表”))
    (T(APPEND(MY-APPEND(CAR A1)(CAR A2))(SHUFFLE(CDR A1)(CDR A2 ')))
    [106]为呼叫应用帧(洗牌(3)'(6))
    # 2
    [100]表单评估帧(随机播放(CDR A1)(CDR A2))
    [94]表单的EVAL帧(APPEND(MY-APPEND(CAR A1)(CAR A2))(SHUFFLE(CDR A1)(CDR A2)))
    #
    [90]表格的评估框架
    (COND((/=(LEN A2)(LEN A1))(PRINC“列表的长度不相等”))
    ((和(空A1)(空A2))(PRINC“无序列表”))
    (T(APPEND(MY-APPEND(CAR A1)(CAR A2))(SHUFFLE(CDR A1)(CDR A2 ')))
    [73]为呼叫应用帧(随机播放(23)'(56))
    # 2
    [67]表单评估框架(随机播放(CDR A1)(CDR A2))
    [61]表单的EVAL帧(APPEND(MY-APPEND(CAR A1)(CAR A2))(SHUFFLE(CDR A1)(CDR A2)))
    #
    [57]表格的评估框架
    (COND((/=(LEN A2)(LEN A1))(PRINC“列表的长度不相等”))
    ((和(空A1)(空A2))(PRINC“无序列表”))
    (T(APPEND(MY-APPEND(CAR A1)(CAR A2))(SHUFFLE(CDR A1)(CDR A2 ')))
    [40]为呼叫应用帧(随机播放(1234)(456))
    # 2
    [34]形式评估框架(洗牌(1 2 3)’(4 5 6))
    印刷21帧
    

    请慢慢阅读。您可以忽略前10行;它们是clisp调试器本身的产物。但其余部分将让您了解您的程序正在执行的操作。

    stackoverflow社区可能提供的关于此特定问题的任何特定答案只会帮助您解决此问题,而不会帮助您解决下一个问题

    您应该问的真正问题是:如何使用公共Lisp调试器?

    由于您正在使用clisp,请熟悉clisp的调试器

  • 尝试
    获取命令列表
  • 使用
    :bt
    获取堆栈跟踪
  • 在这种情况下:

    Break 1 [6]> :bt
    <1/289> #<SYSTEM-FUNCTION SHOW-STACK> 3
    <2/282> #<COMPILED-FUNCTION SYSTEM::PRINT-BACKTRACE>
    <3/276> #<COMPILED-FUNCTION SYSTEM::DEBUG-BACKTRACE>
    <4/267> #<SYSTEM-FUNCTION SYSTEM::READ-EVAL-PRINT> 2
    <5/264> #<COMPILED-FUNCTION SYSTEM::BREAK-LOOP-2-3>
    <6/260> #<SYSTEM-FUNCTION SYSTEM::SAME-ENV-AS> 2
    <7/246> #<COMPILED-FUNCTION SYSTEM::BREAK-LOOP-2>
    <8/244> #<SYSTEM-FUNCTION SYSTEM::DRIVER>
    <9/204> #<COMPILED-FUNCTION SYSTEM::BREAK-LOOP>
    <10/201> #<SYSTEM-FUNCTION INVOKE-DEBUGGER> 1
    <11/191> #<SYSTEM-FUNCTION CAR>
    [190] EVAL frame for form (CAR A1)
    [186] EVAL frame for form (CONS (CAR A1) (APPEND (CDR A1) A2))
    <12/183> #<SPECIAL-OPERATOR COND>
    [182] EVAL frame for form (COND ((NULL A2) A1) (T (CONS (CAR A1) (APPEND (CDR A1) A2))))
    [165] APPLY frame for call (APPEND '6 '"lists shuffled")
    <13/160> 
    #<FUNCTION APPEND (A1 A2) (DECLARE (SYSTEM::IN-DEFUN APPEND))
      (BLOCK APPEND
       (COND ((NULL A2) A1) (T (CONS (CAR A1) (APPEND (CDR A1) A2)))))> 2
    [159] EVAL frame for form (APPEND (CDR A1) A2)
    [154] EVAL frame for form (CONS (CAR A1) (APPEND (CDR A1) A2))
    <14/151> #<SPECIAL-OPERATOR COND>
    [150] EVAL frame for form (COND ((NULL A2) A1) (T (CONS (CAR A1) (APPEND (CDR A1) A2))))
    [133] APPLY frame for call (APPEND '(3 . 6) '"lists shuffled")
    <15/128> 
    #<FUNCTION APPEND (A1 A2) (DECLARE (SYSTEM::IN-DEFUN APPEND))
      (BLOCK APPEND
       (COND ((NULL A2) A1) (T (CONS (CAR A1) (APPEND (CDR A1) A2)))))> 2
    [127] EVAL frame for form (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2)))
    <16/124> #<SPECIAL-OPERATOR COND>
    [123] EVAL frame for form 
    (COND ((/= (LEN A2) (LEN A1)) (PRINC "lengths of the lists are not equal"))
     ((AND (NULL A1) (NULL A2)) (PRINC "lists shuffled"))
     (T (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2)))))
    [106] APPLY frame for call (SHUFFLE '(3) '(6))
    <17/101> 
    #<FUNCTION SHUFFLE (A1 A2) (DECLARE (SYSTEM::IN-DEFUN SHUFFLE))
      (BLOCK SHUFFLE
       (COND
        ((/= (LEN A2) (LEN A1)) (PRINC "lengths of the lists are not equal"))
        ((AND (NULL A1) (NULL A2)) (PRINC "lists shuffled"))
        (T
         (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2))))))> 2
    [100] EVAL frame for form (SHUFFLE (CDR A1) (CDR A2))
    [94] EVAL frame for form (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2)))
    <18/91> #<SPECIAL-OPERATOR COND>
    [90] EVAL frame for form 
    (COND ((/= (LEN A2) (LEN A1)) (PRINC "lengths of the lists are not equal"))
     ((AND (NULL A1) (NULL A2)) (PRINC "lists shuffled"))
     (T (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2)))))
    [73] APPLY frame for call (SHUFFLE '(2 3) '(5 6))
    <19/68> 
    #<FUNCTION SHUFFLE (A1 A2) (DECLARE (SYSTEM::IN-DEFUN SHUFFLE))
      (BLOCK SHUFFLE
       (COND
        ((/= (LEN A2) (LEN A1)) (PRINC "lengths of the lists are not equal"))
        ((AND (NULL A1) (NULL A2)) (PRINC "lists shuffled"))
        (T
         (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2))))))> 2
    [67] EVAL frame for form (SHUFFLE (CDR A1) (CDR A2))
    [61] EVAL frame for form (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2)))
    <20/58> #<SPECIAL-OPERATOR COND>
    [57] EVAL frame for form 
    (COND ((/= (LEN A2) (LEN A1)) (PRINC "lengths of the lists are not equal"))
     ((AND (NULL A1) (NULL A2)) (PRINC "lists shuffled"))
     (T (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2)))))
    [40] APPLY frame for call (SHUFFLE '(1 2 3) '(4 5 6))
    <21/35> 
    #<FUNCTION SHUFFLE (A1 A2) (DECLARE (SYSTEM::IN-DEFUN SHUFFLE))
      (BLOCK SHUFFLE
       (COND
        ((/= (LEN A2) (LEN A1)) (PRINC "lengths of the lists are not equal"))
        ((AND (NULL A1) (NULL A2)) (PRINC "lists shuffled"))
        (T
         (APPEND (MY-APPEND (CAR A1) (CAR A2)) (SHUFFLE (CDR A1) (CDR A2))))))> 2
    [34] EVAL frame for form (SHUFFLE '(1 2 3) '(4 5 6))
    Printed 21 frames
    
    中断1[6]>:bt
    # 3
    #
    #
    # 2
    #
    # 2
    #
    #
    #
    # 1
    #
    [190]模板的评估框架(A1车)
    [186]表格的评估框架(CONS(A1车厢)(附加(CDR A1)A2))
    #
    [182]表格的评估框架(COND((空A2)A1)(T(CONS(CAR A1)(附加(CDR A1)A2)))
    [165]为调用应用帧(附加“6”个“无序列表”)
    # 2
    [159]表格的评估框架(附加(CDR A1)A2)
    [154]表格的评估框架(CONS(A1车厢)(附加(CDR A1)A2))
    #
    [150]表格的评估框架(COND((空A2)A1)(T(CONS(CAR A1)(附加(CDR A1)A2)))
    [133]为调用应用帧(附加“(3.6)“无序列表”)
    # 2
    [127]表单的EVAL帧(APPEND(MY-APPEND(CAR A1)(CAR A2))(SHUFFLE(CDR A1)(CDR A2)))
    #
    [123]表格的评估框架
    (COND((/=(LEN A2)(LEN A1))(PRINC“列表的长度不相等”))
    ((和(空A1)(空A2))(PRINC“无序列表”))
    (T(APPEND(MY-APPEND(CAR A1)(CAR A2))(SHUFFLE(CDR A1)(CDR A2 ')))
    [106]为呼叫应用帧(洗牌(3)'(6))
    # 2
    [100]表单评估帧(随机播放(CDR A1)(CDR A2))
    [94]表单的EVAL帧(APPEND(MY-APPEND(CAR A1)(CAR A2))(SHUFFLE(CDR A1)(CDR A2)))
    #
    [90]表格的评估框架
    (COND((/=(LEN A2)(LEN A1))(PRINC“列表的长度不相等”))
    ((和(空A1)(空A2))(PRINC“无序列表”))
    (T(APPEND(MY-APPEND(CAR A1)(CAR A2))(SHUFFLE(CDR A1)(CDR A2 ')))
    [73]为呼叫应用帧(随机播放(23)'(56))
    # 2
    [67]表单评估框架(随机播放(CDR A1)(CDR A2))
    [61]表单的EVAL帧(APPEND(MY-APPEND(CAR A1)(CAR A2))(SHUFFLE(CDR A1)(CDR A2)))
    #
    [57]表格的评估框架
    (COND((/=(LEN A2)(LEN A1))(PRINC“列表的长度不相等”))
    ((和(空A1)(空A2))(PRINC“无序列表”))
    (T)附加