如何解决lisp中格式错误的lambda?

如何解决lisp中格式错误的lambda?,lisp,common-lisp,Lisp,Common Lisp,我正在尝试检查列表是否在lisp中有山的方面。 e、 g:1,5,9,6,4,3 l是我的列表,aux是0-列表的升序部分或1-列表的降序部分。 muntemain只需调用munte,从aux=0开始,升序部分 我的错误是: Badly formed lambda: (AND (< (CAR L) (CAR (CDR L))) (EQ AUX 0)) 结构不良的lambda:(和((左车)(左车))(平衡辅助1))(蒙特(左车cdr)1)) (无) ) ) (defun muntema

我正在尝试检查列表是否在lisp中有山的方面。 e、 g:1,5,9,6,4,3

l是我的列表,aux是0-列表的升序部分或1-列表的降序部分。 muntemain只需调用munte,从aux=0开始,升序部分

我的错误是:

 Badly formed lambda: (AND (< (CAR L) (CAR (CDR L))) (EQ AUX 0))
结构不良的lambda:(和(<(汽车L)(汽车CDR L))(等式辅助0))
我看不出有什么问题。有人能帮忙吗

(defun munte (l aux)
      (cond 
          ((and (atom l) (null aux)) NIL)
          ((and (null l) (null aux)) NIL)
          ((and (atom l) (eq aux 1)) T)
          ((and (null l) (eq aux 1) T)
          ((and (< (car l) (car(cdr l))) (eq aux 0)) (munte(cdr l) 0))
          ((and (or (> (car l) (cadr l)) (= (car l) (cadr l))) (eq aux 0))(munte(cdr l) 1))
          ( and (> (car l) (cadr l)) (eq aux 1)) (munte(cdr l) 1))
          (T NIL)
)
)

(defun muntemain (l)
(cond 
         ((> (car l) (cadr l)) NIL)
         ((< (length l) 2) NIL)
         (T (munte l 0))
)
)
(除左外)
(续)
((和(原子l)(空辅助)零)
((和(空l)(空辅助))无)
((和(原子l)(等式1))T)
((和(空l)(等式辅助1)T)
((和(<(左车)(左车)(0号方程式)(左车)(0号方程式))
((和(或)(>(左车)(左车)(左车))(=(左车)(左车)))(等式辅助0))(蒙特(cdr l)1))
(和(>(左车)(左车))(平衡辅助1))(蒙特(左车cdr)1))
(无)
)
)
(defun muntemain(左)
(续)
((>(左车)(左卡))无)
(<(长度l)2)无)
(T(muntel0))
)
)
格式化 实际上,您确实需要使用编辑器来帮助您处理括号。有许多关于安装Emacs+Slime的教程。花些时间安装合适的工具

不要用于数字和字符 允许实现“复制”字符和字符 任何时候都可以使用数字。其效果是Common Lisp不能保证 即使eq的两个参数“相同”,如果 那东西是一个字符或数字

因子分解检验 根据的定义,
NIL
是一个原子,因此不需要
(null L)
aux
的不同情况也可以分组。以下条款足以解释上述所有条款:

    ((atom L) (eql aux 1))
但是我不明白,如果总是将
aux
绑定到0或1,为什么它不是布尔值。只需在上述子句中使用
t
nil
并返回
aux

使用有意义的函数 如果列表中没有第二个元素呢?您将把一个数字与
nil
进行比较,并发出错误信号(不是您想要的)。你需要更多的测试。在
muntemain
中,当长度小于2时,您似乎有一个特殊情况,但只有当前面的返回
nil
时,才会进行测试,如果发出错误信号,则不会发生这种情况

迭代替代方案 这里有一个完全不同的方法来解决这个问题,只是给你一些想法

(lambda (list)
  (loop
    ;; memories
    for px = nil then x
    for pdx = nil then dx

    ;; current element
    for x in list

    ;; first and second "derivatives" (signs only)
    for dx = 1 then (signum (- x px))
    for ddx = 0 then (signum (- dx pdx))

    ;; checks
    sum ddx into total
    always (and (<= dx 0) (<= -1 total 0))
    finally (return (= total -1))))
(lambda(列表)
(环路
记忆
对于px=nil,则x
对于pdx=零,则为dx
当前元素
对于列表中的x
第一和第二“导数”(仅限符号)
对于dx=1,则(符号(-x px))
对于ddx=0,则(符号(-dx-pdx))
支票
将ddx加总

始终(和)(您在
(eq aux 1)
之前的行中缺少一个右括号。
之前的行中也缺少一个开括号。
之前的行中缺少一个
(T NIL)
。使用带有括号匹配和自动缩进的编辑器。谢谢。我用first和second更改了代码,现在它编译时没有括号errors@PădureanFlorina Alexandra太好了,继续。如果答案对你有好处,我们鼓励你“接受”它(绿色复选标记)。
(< (car l) (car(cdr l)))
(< (first L) (second L))
(lambda (list)
  (loop
    ;; memories
    for px = nil then x
    for pdx = nil then dx

    ;; current element
    for x in list

    ;; first and second "derivatives" (signs only)
    for dx = 1 then (signum (- x px))
    for ddx = 0 then (signum (- dx pdx))

    ;; checks
    sum ddx into total
    always (and (<= dx 0) (<= -1 total 0))
    finally (return (= total -1))))