【问题标题】:More simple Lisp functions not working更简单的 Lisp 函数不起作用
【发布时间】:2014-02-18 16:09:29
【问题描述】:

我正在尝试制作一个计算列表中列表数量的函数。

 (defun test (a)
           (if (equal a nil) (return-from test 0))
           (if (not (listp a)) (print "case a") (return-from test (+ 0 (test (cdr a))))
             (print "case b")(return-from test (+ 1 (test (cdr a)))))
           )

我不知道调试器是如何工作的,所以我尝试了一些使用打印语句的新手调试。上面的代码甚至没有执行。我不知道为什么。有效但给出错误答案的原始代码如下:

 (defun test (a)
           (if (equal a nil) (return-from test 0))
           (if (not (listp a)) (return-from test (+ 0 (test (cdr a))))
             (return-from test (+ 1 (test (cdr a)))))
           )

这是返回元素周期的数量,无论是否列表。我看不出我哪里错了。另一个问题也是,当我调用 (test 1) 或对任何原子进行测试时,它会崩溃。当然,您不能获取原子的 cdr,但我可以进行哪些错误检查?我可以进行哪些更改才能使这个荒谬的功能发挥作用?

【问题讨论】:

  • 好的,我很遗憾向您展示了 return-from 示例 ;-) 再一次,cond 会将您救到这里。
  • 我不确定条件... 其工作方式的含义。它是在发现第一个为真后检查每个语句还是只执行第一个为真的语句?这是我没有使用它的唯一原因。再次感谢您的耐心和帮助!
  • @user3270407 如果你使用 Common Lisp,这里有关于 cond 的信息:clhs.lisp.se/Body/m_cond.htm 在大多数 lisps 中 cond 的行为都是一样的。
  • 只有第一个是真的。见clhs.lisp.se/Body/m_cond.htm

标签: lisp


【解决方案1】:

第一个块不起作用,因为函数“if”在其中最多处理 3 种形式(条件 then-branch else-branch)。如果你想在一个分支中执行一些操作,你应该用 progn 包装它们:

(if (not (listp a))
  (progn
    (print "case a")
    (return-from test (+ 0 (test (cdr a)))))
  (progn
    (print "case b")
    (return-from test (+ 1 (test (cdr a))))))

第二个问题是检查(listp a)。您应该检查第一个元素是否是列表而不是整个列表是列表 (listp (car a))。

我不知道,你用的是什么 lisp 方言。在大多数情况下,“cond”形式是可用的,不需要特殊形式“return-from”。所以,你可以重写你的函数如下:

(defun test (a)
  (cond
    ((not (listp a)) nil) ; "atom" case
    ((not a) 0) ; empty list case
    ((listp (car a)) ; first element is list
     (print "case list")
     (+ 1 (test (cdr a))))
    (T ; fist element is not list
     (print "case not list")
     (test (cdr a))))) ; avoid adding zero because it has no effect

【讨论】:

  • 如果a 不是列表,为什么不返回0?该函数应该产生一个数字。
  • 是的,progn 执行所有表单并返回最后一个的结果。
  • 谢谢大家。很抱歉一直问 Lisp 问题!
  • @YuriyKovalev 不确定我明白你的意思。 (test 1) 应该返回 0,而不是 nil
  • @user3270407:如果您使用的是 Common Lisp,那么 Practical Common Lisp 的所有章节都可以在线获得:gigamonkeys.com/book。另请参阅 Common Lisp Hyperspec 以了解特定功能的功能文档。
猜你喜欢
  • 2023-03-23
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 2013-03-23
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
相关资源
最近更新 更多