Common Lisp lambda 表达式错误

2023-12-09

我正在尝试制作一个程序,它将重写给定的行,而不会在输出行中出现重复项。我使用这个网站作为编译器:https://www.tutorialspoint.com/execute_lisp_online.php

这是我的代码

(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

抱歉格式化,我是函数式编程和 Lisp 的新手,我不知道应该如何正确地完成它。


你的代码:

第一行:

(DEFUN REMDOUBLES (INPUT OUTPUT)

第二行:你能解释一下单括号应该做什么吗?

(

您还记得基本 Lisp 表达式的 Lisp 语法吗?

(operator argument0 argument1 ... argumentn)

它不是

((operator argument0 argument1 ... argumentn))

抱歉格式化,我是函数式编程和 LISP 的新手,我不知道应该如何正确完成它。

从 Touretzky 下载 Lisp 入门书:https://www.cs.cmu.edu/~dst/LispBook/

然后在那里了解 Lisp 代码的样子。

您还可以使用 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))))))

但写成这样会更好:

(DEFUN SEARCHDEEP (WHAT WHERE)
  (WHEN WHERE
    (OR (IF (ATOM (CAR WHERE))
            (EQUAL WHAT (CAR WHERE))
          (SEARCHDEEP WHAT (CAR WHERE)))
        (SEARCHDEEP WHAT (CDR WHERE)))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Common Lisp lambda 表达式错误 的相关文章

随机推荐