lisp最后一个元素的功能形式

时间:2016-05-12 17:26:02

标签: lisp

嘿伙计我需要帮助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的新手,并试图完成这项任务。我希望你们能帮助我,让我知道为什么我会收到这个错误,这是我最后一个功能形式的逻辑吗?谢谢!

2 个答案:

答案 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))))