嘿伙计我需要帮助lisp功能。我应该创建:
(myLast L) 评估列表L的最后一个元素。 例如。 (myLast'(p 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的新手,并试图完成这项任务。我希望你们能帮助我,让我知道为什么我会收到这个错误,这是我最后一个功能形式的逻辑吗?谢谢!
答案 0 :(得分:1)
错误消息与您的代码无关。您可能在没有引号的情况下键入(load myhw4.lisp)
,在这种情况下,您的Lisp正确地认为您想要将值绑定到变量myhw4.lisp
,而该变量不存在。您需要引用字符串"like so"
。
此外,((eq L '()) ...)
是有问题的,因为第一种形式是(eq ...)
,它不是函数或lambda。这将发出错误信号..
上面的代码使您的代码出错,但距离它不远。
答案 1 :(得分:1)
您的代码存在多个问题。
你有多余的括号。不允许((eq L '())
,因为操作员位置允许的唯一表达式是匿名函数。
你的if
只有结果表达但不是替代。它不是最后一个表达式,因此它是死代码。
你做car
,到目前为止代码也不在实际位置。
尾部表达式是递归并且无条件地完成。它被称为无限递归。
我想也许你的意思是这样的:
(defun myLast (list)
(if (null (cdr list))
(car list)
(myLast (cdr list))))