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)之后,其中的想法是在现有列表中插入一个空列表,然后在末尾附加一个空列表,然后在中间插入一个空列表.
如果正确缩进函数,则可以看到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缩进区域.
正确!问题就在于它之后的那条线
((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)