几天前我刚刚开始学习 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)))))))
我很确定它发生在 ((equal (length lst) 2) 之后,其中的想法是将一个空列表插入到现有列表中,然后将一个空列表附加到末尾,然后将一个空列表插入到中间。
正确的!问题就在那之后的一行中,它说
((cons nil lst) (append lst nil) (insertat nil lst 3) ...
问题在于两个左括号。括号可以改变特殊上下文中的含义(例如cond
您正在使用的形式),但在这种情况下,括号表示常规函数应用程序,就像您可能习惯的那样。这意味着括号后面的第一个东西必须是一个函数。从outer括号中,第一件事是(cons nil lst)
,所以它一定是一个函数(但它不是)。
请注意,您不能只删除括号,因为cons
函数返回一个像您想要的新列表,但不会更改旧列表。你可能想要这样的东西:
(setq lst (cons nil lst))
(setq lst (append lst nil))
(setq lst (insertat nil lst 3))
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)