常见的lisp错误:"应该是lambda表达式"

Zac*_*ght 9 lisp common-lisp syntax-error

我刚刚开始学习Common Lisp,我正在尝试构建一个将数字插入树中的函数.我收到一个错误,

*** - SYSTEM ::%EXPAND-FORM :( CONS NIL LST)应该是lambda表达式

从谷歌搜索,似乎这种情况发生在你有太多的括号集,但看了一个小时左右,并改变了周围的事情,我无法弄清楚我可以做到这一点.

这是它发生的代码:

(defun insert (lst probe)
    (cond ((null lst) (cons probe lst))
        ((equal (length lst) 1)
            (if (<= probe (first lst))
                (cons probe lst)
                (append lst (list probe))))
        ((equal (length lst) 2)
            ((cons nil lst) (append lst nil) (insertat nil lst 3)
                (cond ((<= probe (second lst)) (insert (first lst) probe))
                     ((> probe (fourth lst)) (insert (fifth lst) probe))
                     (t (insert (third lst) probe)))))))
Run Code Online (Sandbox Code Playgroud)

我很确定它发生在((等于(长度为lst)2)之后,其中的想法是在现有列表中插入一个空列表,然后在末尾附加一个空列表,然后在中间插入一个空列表.

Rai*_*wig 7

如果正确缩进函数,则可以看到CONS NIL LST前面有一个额外的括号.

(defun insert (lst probe)
  (cond ((null lst) (cons probe lst))
        ((equal (length lst) 1)
         (if (<= probe (first lst))
             (cons probe lst)
           (append lst (list probe))))
        ((equal (length lst) 2)
         ((cons nil lst) (append lst nil) (insertat nil lst 3)
          (cond ((<= probe (second lst)) (insert (first lst) probe))
                ((> probe (fourth lst)) (insert (fifth lst) probe))
                (t (insert (third lst) probe)))))))
Run Code Online (Sandbox Code Playgroud)

在大多数Lisp IDE中,您可以缩进表达式.在LispWorks中,选择整个表达式并执行mx缩进区域.


Noa*_*ine 5

正确!问题就在于它之后的那条线

((cons nil lst) (append lst nil) (insertat nil lst 3) ...
Run Code Online (Sandbox Code Playgroud)

问题是两个开头的括号.括号可以在特殊上下文中改变含义(比如cond您正在使用的形式),但在此上下文中,括号表示常规函数应用程序,就像您可能习惯的那样.这意味着括号后的第一件事必须是函数.从括号的角度来看,首先是(cons nil lst),所以必须是一个函数(它不是).

请注意,您不能只删除括号,因为该cons函数会返回您想要的新列表,但不会更改旧列表.你可能想要这样的东西:

(setq lst (cons nil lst))
(setq lst (append lst nil))
(setq lst (insertat nil lst 3))
...
Run Code Online (Sandbox Code Playgroud)