2016-10-01 3 views
0

출력 행에 중복없이 지정된 행을 다시 쓰는 프로그램을 만들려고합니다. 내가 컴파일러로이 웹 사이트를 사용하고 있습니다 : 여기 https://www.tutorialspoint.com/execute_lisp_online.phpCommon Lisp lambda expression error

그리고 것은 그러나 나는 단서가 없다, 나는 스택에이 코드를 여기에 다른 답변을 확인하는 마지막 2 시간 보냈다

(SETQ X (LIST 2 -3 (LIST 4 3 0 2) (LIST 4 -4) (LIST 2 (LIST 2 0 2))-3))' 
(DEFUN SEARCHDEEP (WHAT WHERE) ;Function will find out if atom `WHAT`is in a row `WHERE` => works fine 
(COND 
    ((NULL WHERE) NIL) 
    (T (OR 
      (COND 
       ((ATOM (CAR WHERE)) (EQUAL WHAT (CAR WHERE))) 
       (T (SEARCHDEEP WHAT (CAR WHERE))) 
      ) 
      (SEARCHDEEP WHAT (CDR WHERE)) 
     ) 
    ) 
) 
) 

(DEFUN REMDOUBLES (INPUT OUTPUT) 
(
(COND 
    ((NULL INPUT) NILL) ;recursion exit 
    (T     ; funstion 
     (OR    ; step into or go forward 
      (COND 
       ((ATOM (CAR INPUT)) (COND 
             ((NOT (SEARCHDEEP (CAR INPUT) OUTPUT)) (APPEND OUTPUT INPUT)) ;if this atom wasn't added => append 
            ) 
       ) 
       (T (REMDOUBLES (CAR INPUT) OUTPUT)) ; step into (car input => list 
      ) 
      (REMDOUBLES (CRD INPUT) OUTPUT) ; go forward, car input is anatom 
     ) 
    ) 
) 
) 
) 

(SETQ OUT (QUOTE)) ;Empty row 
(REMDOUBLES X OUT) 
(PRINT OUT) 

내 코드 무엇인지 나는 여기서 빠져있다.

나는이 오류가 무엇입니까 : 형식에 대한

*** - SYSTEM::%EXPAND-FORM:
(COND ((NULL INPUT) NILL)(T(OR (COND ((ATOM (CAR INPUT)) (COND ((NOT (SEARCHDEEP (CAR INPUT) OUTPUT))(APPEND OUTPUT INPUT)))) (T (REMDOUBLES (CAR INPUT) OUTPUT))) (REMDOUBLES (CRD INPUT) OUTPUT)))) should be a lambda expression

미안, 나는 기능적 프로그래밍과 리스프에서 초보자입니다, 나는 제대로 할 방법을 모른다.

+2

'(DEFUN REMDOUBLES (INPUT OUTPUT)'과'(COND') 사이에 여분의 여는 괄호가 있습니다. 들여 쓰기 코드가 올바르게! 세미 편집자가 들여 쓰기를합니다. – Gilles

+1

또한'((NULL INPUT) NIL)'줄에 오류가 있습니다.'((NULL INPUT) NIL)'이어야합니다. –

답변

5

귀하의 코드 :

첫 번째 줄 :

(DEFUN REMDOUBLES (INPUT OUTPUT) 

두 번째 줄 : 당신이 하나의 괄호가 무엇을해야하는지 설명 할 수 있습니까?

(

기본 Lisp 식에 대한 Lisp 구문을 기억하십니까? https://www.cs.cmu.edu/~dst/LispBook/

다음 코드처럼 보이는 방법 리스프가 배우 :

(operator argument0 argument1 ... argumentn) 

이 Touretzky에서 소개 리스프 책을 다운로드

((operator argument0 argument1 ... argumentn)) 

Sorry for the formatting, i am novice in functional programming and LISP, and i have no idea how it should be done properly.

아니다.

[4]> (pprint '(DEFUN SEARCHDEEP (WHAT WHERE) ;Function will find out if atom `WHAT`is in a row `WHERE` => works fine 
(COND 
    ((NULL WHERE) NIL) 
    (T (OR 
      (COND 
       ((ATOM (CAR WHERE)) (EQUAL WHAT (CAR WHERE))) 
       (T (SEARCHDEEP WHAT (CAR WHERE))) 
      ) 
      (SEARCHDEEP WHAT (CDR WHERE)) 
     ) 
    ) 
) 
)) 

이것은 형식의 코드입니다 : 이것은 당신의 포맷되지 않은 코드

을 :

당신은 또한 당신의 코드를 포맷 리스프를 사용할 수 있습니다

(DEFUN SEARCHDEEP (WHAT WHERE) 
(COND ((NULL WHERE) NIL) 
    (T 
    (OR 
    (COND ((ATOM (CAR WHERE)) (EQUAL WHAT (CAR WHERE))) 
    (T (SEARCHDEEP WHAT (CAR WHERE)))) 
    (SEARCHDEEP WHAT (CDR WHERE)))))) 

는하지만 것 더 나은 것으로 작성된 :