jalaja
jalaja

Reputation: 13

Car: 6 is not a list error

I'm trying to write a program in CLisp which perfectly shuffles the two lists. Below is my program. When I gave the input to the program as (shuffle '(1 2 3) '(4 5 6)). it is giving an error car:6 is not a list.

(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))
           )
        )
    )
)

can someone help me??

Upvotes: 0

Views: 606

Answers (2)

Bruno Haible
Bruno Haible

Reputation: 1292

Any particular answer to this particular question the stackoverflow community may provide will only help you with this question, but not with the next one.

The real question you should be asking is: How do I use a Common Lisp debugger?

Since you are using clisp, get familiar with clisp's debugger.

  1. Try ? to get a list of commands.
  2. Use :bt to get a stack trace.

In this case:

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

Read through it slowly. You can ignore the first 10 lines; they are an artifact of clisp's debugger itself. But the rest will give you an understanding of what your program is doing.

Upvotes: 2

AlexP
AlexP

Reputation: 4430

Let's execute by hand (shuffle '(3) '(6)):

  1. (shuffle '(3) '(6))
  2. (append (my-append 3 6) (shuffle '() '())
  3. myappend returns (cons 3 6), so we have (append (cons 3 6) nil)
  4. (cons 3 (append 6 nil))
  5. (cons 3 (cons (car 6) nil))(car 6) balks because in truth 6 is not a list.

Upvotes: 4

Related Questions