gpt4 book ai didi

syntax-error - 常见的 lisp 错误 : "should be lambda expression"

转载 作者:太空宇宙 更新时间:2023-11-03 19:01:34 25 4
gpt4 key购买 nike

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

*** - SYSTEM::%EXPAND-FORM: (CONS NIL LST) should be a lambda expression

通过谷歌搜索,当你有太多的括号时,似乎会发生这种情况,但在看了一个小时左右并改变了一些东西之后,我想不出我可以在哪里做这件事。

这是发生的代码:

(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))
...

关于syntax-error - 常见的 lisp 错误 : "should be lambda expression",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47648271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com