2017-11-19 14 views
0

CLisp에서 두 목록을 완벽하게 뒤섞어 쓰는 프로그램을 작성하려고합니다. 아래는 제 프로그램입니다. 프로그램 입력 내용을 (shuffle '(1 2 3) '(4 5 6))으로주었습니다. car:6 is not a list 오류가 발생했습니다.자동차 : 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)) 
      ) 
     ) 
    ) 
) 

누군가 나를 도울 수 있습니까 ??

+2

'append'라는 함수를 작성했습니다. 'append'는 Common Lisp 함수이기 때문에 이름을 사용하면 안된다. Common Lisp 표준은 또한 이것을 허용하지 않기 때문에 일반적인 구현은 Lisp의 작동 핵심 기능을 자신의 시도로 대체하여 발을 쏘지 않도록 경고하거나 오류를 줄 것이다. –

답변

4

의 손 (shuffle '(3) '(6))에 의해 실행 보자 -

  • (append (my-append 3 6) (shuffle '() '()) -

    1. (shuffle '(3) '(6))
    2. myappend 반환 (cons 3 6), 그래서 우리는 (append (cons 3 6) nil)이 -
    3. (cons 3 (append 6 nil))-
    4. (cons 3 (cons (car 6) nil)) - 때문에 진리 (car 6) balks을 6은 목록이 아닙니다.
  • +0

    해보려고 노력했는데 ... – jalaja

    2

    stackoverflow 커뮤니티가 제공 할 수있는이 특정 질문에 대한 특정 대답은이 질문에 도움이되지만 다음 질문에는 도움이되지 않습니다.

    질문해야 할 질문은 다음과 같습니다. Common Lisp 디버거는 어떻게 사용합니까?

    clisp을 사용 중이므로 clisp의 디버거에 익숙해집니다.

    1. 시도 목록을 보려면 ?을 시도하십시오.
    2. :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 
    

    천천히 그것을 통해 읽어 보시기 바랍니다. 처음 10 줄을 무시할 수 있습니다. 그것들은 clisp의 디버거 자체의 인공물입니다. 그러나 나머지는 당신에게 당신의 프로그램이 무엇을하고 있는지에 대한 이해를 줄 것입니다.

    +0

    고마워요. – jalaja