2016-10-01 5 views
0

プログラムを作成しようとしていますが、出力行に重複がなく、指定された行が書き換えられます。私は、コンパイラとして、このウェブサイトを使用しています: https://www.tutorialspoint.com/execute_lisp_online.phpCommon Lispラムダ式エラー

そしてここでは、私のコード

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

である私は、しかし、私は何見当もつかない、スタック上に、ここではこのコードや他の回答を確認し、最後の2時間を費やしています私はここで行方不明です。私はこのエラーを取得しています

の書式設定のため申し訳ありません

*** - 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

、私は関数型プログラミングとLispで初心者だ、と私はそれが適切に行われるべきか見当がつかない。

+2

'(DEFUN REMDOUBLES(INPUT OUTPUT)'と '(COND')の間に余分な開き括弧があります。コードを正しくインデントしてください。任意の半分のエディタがインデントします。 – Gilles

+1

'((NULL INPUT)NILL)'行にもエラーがあります。 '((NULL INPUT)NIL)'にする必要があります。 –

答えて

5

あなたのコード:

最初の行:

(DEFUN REMDOUBLES (INPUT OUTPUT) 

2行目:あなたは、単一の括弧は何をすべきかを説明できますか?

(

基本的なLisp式のLisp構文は覚えていますか? https://www.cs.cmu.edu/~dst/LispBook/

その後のコードはどのように見えるかのLispが学ぶ:

(operator argument0 argument1 ... argumentn) 

それはTouretzkyから入門Lispの本をダウンロード

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

ではありません。

あなたはまた、あなたのためのコードをフォーマットするためのLispを使用することができます

これはあなたのフォーマットされていないコードです:

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

しかし、それは次のようになります

関連する問題