Common Lisp lambda 表达式错误
Common Lisp lambda expression error
我正在尝试制作一个程序,它将重写给定的行而不在输出行中重复。我正在使用这个网站作为编译器:
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)
我花了最后 2 个小时在堆栈上检查这段代码和其他答案,但是我不知道我在这里遗漏了什么。
我收到这个错误:
*** - 系统::%EXPAND-FORM:<br>
(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)))) 应该是lambda表达式
抱歉格式化,我是函数式编程和 Lisp 的新手,我不知道应该如何正确完成。
您的代码:
第一行:
(DEFUN REMDOUBLES (INPUT OUTPUT)
第二行:你能解释一下单括号应该做什么吗?
(
您还记得基本 Lisp 表达式的 Lisp 语法吗?
(operator argument0 argument1 ... argumentn)
不是
((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.
从 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)))))
我正在尝试制作一个程序,它将重写给定的行而不在输出行中重复。我正在使用这个网站作为编译器: 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)
我花了最后 2 个小时在堆栈上检查这段代码和其他答案,但是我不知道我在这里遗漏了什么。
我收到这个错误:
*** - 系统::%EXPAND-FORM:<br>
(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)))) 应该是lambda表达式
抱歉格式化,我是函数式编程和 Lisp 的新手,我不知道应该如何正确完成。
您的代码:
第一行:
(DEFUN REMDOUBLES (INPUT OUTPUT)
第二行:你能解释一下单括号应该做什么吗?
(
您还记得基本 Lisp 表达式的 Lisp 语法吗?
(operator argument0 argument1 ... argumentn)
不是
((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.
从 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)))))