【问题标题】:lisp last element functional formlisp 最后一个元素函数形式
【发布时间】:2016-05-12 17:26:01
【问题描述】:

大家好,我需要有关 lisp 功能的帮助。我应该创建:

(myLast L) 计算到列表 L 的最后一个元素。 例如。 (myLast '(p a e g)) → g

我不能只使用我们在课堂上给出的所有预定义的 lisp 形式:

(atom X)
(quote X)
‘X
(eq X Y)
(cons X L)
(car L)
(cdr L)
(list A B C)
(if X Y Z)      
(cond (C1 S1) (C2 S2) …… (Cn Sn))       

我认为我输入的时候是对的:

(defun myLast (L)
   (if ((eq L '()) (cdr L))
      (car L)
      (myLast (cdr L))))

但是我得到一个错误:

Error: The variable MYHW4.LISP is unbound.
Error signalled by EVAL
Backtrace: EVAL
Broken at SYSTEM::GCL-TOP-LEVEL.

我对 LISP 完全陌生,正在努力完成这项任务。我希望你们能帮助我,让我知道为什么会出现这个错误,我对最后一个函数形式的逻辑是否正确?谢谢!

【问题讨论】:

    标签: lisp


    【解决方案1】:

    您的代码存在多个问题。

    你有多余的括号。 ((eq L '()) 是不允许的,因为在运算符位置允许的唯一表达式是匿名函数。

    您的if 只有一个结果表达式,但没有替代项。它不是最后一个表达式,所以它是死代码。

    你做的car,也没有在实际位置到目前为止代码也。

    尾表达式是递归,是无条件执行的。它被称为无限递归。

    我想也许你的意思是这样的:

    (defun myLast (list)
      (if (null (cdr list)) 
          (car list) 
          (myLast (cdr list))))
    

    【讨论】:

      【解决方案2】:

      错误消息与您的代码无关。您可能键入了不带引号的(load myhw4.lisp),在这种情况下,您的Lisp 正确地认为您想要获取绑定到变量myhw4.lisp 的值,而该变量不存在。您需要引用字符串"like so"

      另外,((eq L '()) ...) 是有问题的,因为第一种形式是 (eq ...),它不是函数或 lambda。这将表明一个错误..

      上面的代码让你的代码出错了,但你离它不远了。

      【讨论】:

      • 感谢您的回答。我在尝试加载它时发现我做错了什么。
      • (defun myLast (L) (if (lambda (eq L '()) (cdr L)) (car L) (myLast (cdr L)))) 这是我改的到但有些东西不对我得到列表的第一项而不是最后一项。有什么建议吗?
      • 或者只是(if (eq (cdr L) ()) (car L) (my-last (cdr L)))。我很惊讶你的 Lisp 没有拒绝你的 lambda 的参数列表。另外,如果你只测试 (if (lambda ...) x y) 那么测试总是 T,因为一个匿名函数,不是符号 NIL,在布尔上下文中评估为真。所以你总是会选择第一个元素。多做一点测试可能会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2017-11-28
      • 1970-01-01
      相关资源
      最近更新 更多