lisp 最后一个元素函数形式

lisp last element functional form

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

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

我不能使用 lisp 的所有预定义形式,只能使用我们在 class 中给出的形式:

(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 的新手,正在努力完成这项作业。我希望你们能帮助我,让我知道为什么我会收到这个错误,我对最后一个函数形式的逻辑是否正确?谢谢!

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

此外,((eq L '()) ...) 是有问题的,因为第一种形式是 (eq ...),它不是函数或 lambda。这将发出错误信号..

上面说的让你的代码错了,不过你离错不远了。

您的代码存在多个问题。

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

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

你做的car,目前还没有在真正的位置码也。

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

我想你的意思可能是这样的:

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