gpt4 book ai didi

lisp - LISP 中的 IF 错误

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

我对 Lisp 比较陌生,我试图在 LISP 上进行线性搜索。但我没能这样做。我总是收到一条错误消息,指出“IF 的参数太少”。

(setq a '(8 6 2 3 9 5 1))
(LET (key))
(setq key (read))
(loop
(if(= (first a) (key)))
(return t)
(return NIL)
(setq a (rest a))
)

最佳答案

你的代码中有很多问题:

  • 全局setq一个 undefined variable
  • (let (key)) 单独什么都不做。如果要定义全局变量,请使用 defparameterdefvar
  • if 只有一个测试,没有分支。特殊运算符 if 接受一个条件、一个 then 表达式和一个可选的 else 表达式:(if test then [else])
  • 如果您打算将 return 放在 if 中,您的线性搜索将在第一次比较时停止,因为 (return NIL ).实际上,您编写的内容将等同于 (return (= (first a) key)) 并且在这种情况下甚至不需要 loop。也许您打算使用 returnif 中返回一个值,但是 if 是一个已经计算为值的表达式。 return 退出循环(在 loop 周围有一个隐式的 (block NIL ...))。
  • (setq a (rest a)) 类似于 (pop a) 如果您还没有从 返回,这确实是正确的做法在这一点上循环
  • 请注意,= 用于比较数字

你的代码的开头可以写成:

(let ((a '(8 6 2 3 9 5 1))
(key (read)))
(linear-search key a)

然后,您如何执行linear-search 取决于您想要学习的内容。有内置的(findmember)。您还可以将 some 与谓词一起使用。 Loop 有一个 thereis 子句。您甚至可以尝试使用带有 return-fromreducemap。如果你想学习 dotagbody,你将有机会使用 (pop a)

关于lisp - LISP 中的 IF 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33094018/

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